Esempio n. 1
0
 /**
  * TODO: много лишних isset, которые всегда true по определению
  * Сохранение полей модели без учета связей, требующих ID модели
  * @param Model $model
  * @return Model
  */
 protected function saveColumns(Model $model)
 {
     /** @var \T4\Orm\Model $class */
     $class = get_class($model);
     $columns = $class::getColumns();
     $relations = $class::getRelations();
     $cols = [];
     $sets = [];
     $data = [];
     foreach ($columns as $column => $def) {
         if (isset($model->{$column}) && null === $model->{$column} && isset($def['default'])) {
             $sets[$column] = ':' . $column;
             $data[':' . $column] = $def['default'];
         } else {
             $cols[] = $column;
             $sets[$column] = ':' . $column;
             $data[':' . $column] = $model->{$column};
         }
     }
     foreach ($relations as $rel => $def) {
         switch ($def['type']) {
             case $class::BELONGS_TO:
                 $column = $class::getRelationLinkName($def);
                 if (!in_array($column, $cols)) {
                     // todo: test this!
                     //if (isset($model->{$column}) && !is_null($model->{$column})) {
                     if (isset($model->{$column})) {
                         $sets[$column] = ':' . $column;
                         $data[':' . $column] = $model->{$column};
                     } elseif (isset($model->{$rel}) && $model->{$rel} instanceof Model) {
                         $sets[$column] = ':' . $column;
                         $data[':' . $column] = $model->{$rel}->getPk();
                     }
                 }
                 break;
         }
     }
     $connection = $class::getDbConnection();
     if ($model->isNew()) {
         $query = new Query();
         $query->insert($class::getTableName())->values($sets)->params($data);
         $connection->execute($query);
         $model->{$class::PK} = $connection->lastInsertId();
     } else {
         $query = new Query();
         $query->update($class::getTableName())->values($sets)->where($this->quoteName($class::PK) . '=' . $model->getPk())->params($data);
         $connection->execute($query);
     }
     return $model;
 }