/** * 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; }
/** * 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]); }