예제 #1
0
 protected function buildField($id, $info, $default)
 {
     $current = "`{$info['name']}` ";
     $colType = null;
     if (isset($info['type'])) {
         $handler = $this->mapper->determineTypeHandler($info['type']['id']);
         if ($handler) {
             $new = $handler->createColumnType($this->engine, $info);
             if ($new) {
                 $colType = $new;
             }
         }
         if (!$colType) {
             $colType = $info['type']['id'];
         }
     }
     $current .= $colType ?: $default;
     return $current;
 }
예제 #2
0
 /**
  * Insert an object into the database, or values into a table
  * 
  *   insert($object)
  *   insert($object, Meta $meta)
  * 
  * @return int|null
  */
 public function insert($object, $meta = null)
 {
     $query = new Query\Insert();
     if (is_array($meta)) {
         throw new \BadMethodCallException("Please use insertTable()");
     }
     if ($meta) {
         $meta = !$meta instanceof Meta ? $this->mapper->getMeta($meta) : $meta;
     } else {
         $meta = $this->mapper->getMeta(get_class($object));
     }
     if (!$meta->canInsert) {
         throw new Exception("Meta {$meta->id} prohibits insert");
     }
     event_before:
     if (isset($meta->on['beforeInsert'])) {
         foreach ($meta->on['beforeInsert'] as $cb) {
             $cb = [$object, $cb];
             $cb();
         }
     }
     if (isset($this->on['beforeInsert'])) {
         foreach ($this->on['beforeInsert'] as $cb) {
             $cb($object, $meta);
         }
     }
     query:
     $query->values = $this->mapper->mapObjectToRow($object, $meta, 'insert');
     if (!$query->table) {
         $query->table = $meta->table;
     }
     list($sql, $params, $props) = $query->buildQuery($meta);
     $stmt = $this->getConnector()->prepare($sql);
     $stmt->execute($params);
     $lastInsertId = null;
     // we need to be careful with "lastInsertId": SQLite generates one even without a PRIMARY
     if ($object && $meta->primary) {
         $lastInsertId = $this->getConnector()->lastInsertId();
         if ($lastInsertId && $meta->autoinc) {
             $field = $meta->fields[$meta->autoinc];
             $handler = $this->mapper->determineTypeHandler(Mapper::AUTOINC_TYPE);
             if (!$handler) {
                 throw new \UnexpectedValueException();
             }
             $meta->setValue($object, $meta->autoinc, $lastInsertId);
         }
     }
     event_after:
     if (isset($meta->on['afterInsert'])) {
         foreach ($meta->on['afterInsert'] as $cb) {
             $cb = [$object, $cb];
             $cb();
         }
     }
     if (isset($this->on['afterInsert'])) {
         foreach ($this->on['afterInsert'] as $cb) {
             $cb($object, $meta);
         }
     }
     return $lastInsertId;
 }