/**
  * Get the SQL of a update statement
  * @param zibo\library\database\manipulation\statement\manipulation\UpdateStatement $statement
  * @return string SQL of the update statement
  * @throws zibo\library\database\exception\DatabaseException when no table was added to the statement
  * @throws zibo\library\database\exception\DatabaseException when no values where added to the statement
  */
 protected function parseUpdateStatement(UpdateStatement $statement)
 {
     $tables = $statement->getTables();
     if (empty($tables)) {
         throw new DatabaseException('No tables added to the update statement');
     }
     $table = array_shift($tables);
     $values = $statement->getValues();
     if (empty($values)) {
         throw new DatabaseException('No values added to the update statement');
     }
     $sql = '';
     foreach ($values as $valueExpression) {
         $field = $valueExpression->getField();
         $value = $valueExpression->getValue();
         $value = $this->parseExpression($value);
         $sql .= ($sql ? ', ' : '') . $this->connection->quoteIdentifier($field->getName()) . ' = ' . $value;
     }
     $sql = 'UPDATE ' . $this->connection->quoteIdentifier($table->getName()) . ' SET ' . $sql;
     $conditions = $statement->getConditions();
     if ($conditions) {
         $operator = $statement->getOperator();
         $sql .= ' WHERE ' . $this->parseConditions($conditions, $operator, false);
     }
     return $sql;
 }
Example #2
0
 /**
  * Saves a data object to the model
  * @param mixed $data A data object of this model
  * @return null
  * @throws Exception when the data could not be saved
  */
 protected function saveData($data)
 {
     if (is_null($data)) {
         return $data;
     }
     $this->meta->isValidData($data);
     $this->validate($data);
     $table = new TableExpression($this->meta->getName());
     $idField = new FieldExpression(ModelTable::PRIMARY_KEY, $table);
     $isLogged = $this->meta->isLogged();
     if ($isLogged) {
         $logValues = array();
     }
     if (empty($data->id)) {
         $statement = new InsertStatement();
         $isNew = true;
     } else {
         if (isset($this->saveStack[$data->id])) {
             return;
         } else {
             $this->saveStack[$data->id] = $data->id;
         }
         $condition = new SimpleCondition($idField, new ScalarExpression($data->id), Condition::OPERATOR_EQUALS);
         $statement = new UpdateStatement();
         $statement->addCondition($condition);
         $isNew = false;
         if ($isLogged) {
             $localeField = LocalizedModel::FIELD_LOCALE;
             $locale = null;
             if (isset($data->{$localeField})) {
                 $locale = $data->{$localeField};
             }
             $oldData = $this->findById($data->id, 1, $locale, true);
         }
     }
     $statement->addTable($table);
     $properties = $this->meta->getProperties();
     foreach ($properties as $fieldName => $field) {
         if ($fieldName == ModelTable::PRIMARY_KEY || !isset($data->{$fieldName}) || $field->isLocalized()) {
             continue;
         }
         $statement->addValue(new FieldExpression($fieldName), new ScalarExpression($data->{$fieldName}));
         if ($isLogged) {
             $logValues[$fieldName] = $data->{$fieldName};
         }
     }
     $belongsTo = $this->meta->getBelongsTo();
     foreach ($belongsTo as $fieldName => $field) {
         if (!isset($data->{$fieldName}) || $field->isLocalized()) {
             continue;
         }
         $foreignKey = $this->saveBelongsTo($data->{$fieldName}, $fieldName);
         $statement->addValue(new FieldExpression($fieldName), new ScalarExpression($foreignKey));
         if ($isLogged) {
             $logValues[$fieldName] = $data->{$fieldName};
         }
     }
     $fields = $statement->getValues();
     $executeStatement = !empty($fields);
     if (!$executeStatement && $isNew && $this->meta->isLocalized()) {
         $statement->addValue(new FieldExpression(ModelTable::PRIMARY_KEY), new ScalarExpression(0));
         $executeStatement = true;
     }
     if ($executeStatement) {
         $connection = $this->meta->getConnection();
         $connection->executeStatement($statement);
         if ($isNew) {
             $data->id = $connection->getLastInsertId();
         }
         $this->clearCache();
     }
     //        foreach ($belongsTo as $fieldName => $field) {
     //            if (!isset($data->$fieldName)) {
     //                continue;
     //            }
     //
     //            $data->$fieldName = $this->saveLinkedBelongsTo($data->$fieldName, $fieldName, $field, $data->id);
     //        }
     $hasOne = $this->meta->getHasOne();
     foreach ($hasOne as $fieldName => $field) {
         if (!isset($data->{$fieldName}) || $field->isLocalized()) {
             continue;
         }
         $this->saveHasOne($data->{$fieldName}, $fieldName, $data->id);
         if ($isLogged) {
             $logValues[$fieldName] = $data->{$fieldName};
         }
     }
     $hasMany = $this->meta->getHasMany();
     foreach ($hasMany as $fieldName => $field) {
         if (!isset($data->{$fieldName}) || $field->isLocalized()) {
             continue;
         }
         $this->saveHasMany($data->{$fieldName}, $fieldName, $data->id, $isNew, $field->isDependant());
         if ($isLogged) {
             $logValues[$fieldName] = $data->{$fieldName};
         }
     }
     if ($isLogged) {
         if ($isNew) {
             $this->getLogModel()->logInsert($this->getName(), $data, $logValues);
         } else {
             $this->getLogModel()->logUpdate($this->getName(), $data, $logValues, $oldData);
         }
     }
     if ($this->meta->isLocalized()) {
         $this->saveLocalizedData($data);
     }
     unset($this->saveStack[$data->id]);
 }