CakePHP делает сохранение данных модели в один щелчок. Данные, готовые к сохранению, должны быть переданы в метод save(), используя базовый формат:
Array
(
[ModelName] => Array
(
[fieldname1] => 'value'
[fieldname2] => 'value'
)
)
В большинстве случаев вам даже не надо будет беспокоится о формате: хелперы HtmlHelper, FormHelper, и find-методы все пакуют данные в этот формат. Если вы используете любой из хелперов, данные также удобно доступны в $this->data для быстрого использования.
Здесь пример действия контроллера, который использует модель CakePHP для сохранения данных в таблицу базы данных:
<?
function edit($id) {
//Есть ли данные из формы для сохранения?
if(!empty($this->data)) {
//Если данные из формы прошли валидацию и сохранены ...
if($this->Recipe->save($this->data)) {
//Вывести flash-сообщение и перенаправить в '/recipes'.
$this->Session->setFlash("Рецепт сохранен!");
$this->redirect('/recipes');
}
}
//Если нет данных из формы, то найти рецепт для редактирования
//и передать его в отображение.
$this->set('recipe', $this->Recipe->findById($id));
}
?>
Одно дополнительно замечание: когда save() вызван, то данные, переданные в него первым параметром, проходят проверку через механизм валидации CakePHP (смотрите главу «Валидация данных»). Если по каким-то причинам ваши данные не сохраняются, то убедитесь не нарушаются ли правила валидации.
В модели есть несколько методов, касающихся сохранения данных:
Этот метод сохраняет данные из массивов. Второй параметр позволяет вам отклонить валидацию, и с помощью третьего параметра вы можете передать перечень полей модели для сохранения. Для дополнительной безопасности вы можете ограничить сохраняемые поля в этом списке $fieldList.
Метод save также имеет альтернативный синтаксис:
Массив $params может иметь любые, из следующих опций, в качестве индекса массива:
<?
array(
'validate' => true,
'fieldList' => array(),
'callbacks' => true //other possible values are false, 'before', 'after'
)
?>
Дополнительная информация о колбэках модели доступна здесь.
После того, как сохранение завершено, ID для объекта может быть найдено в переменной $id объекта модели – это особенно удобно, когда создаете новые объекты.
<?
$this->Ingredient->save($newData);
$newIngredientId = $this->Ingredient->id;
?>
Этот метод возвращает модель в исходное состояние для сохранения новой информации.
Если параметр $data (используя формат массива, приведенный выше) передан, экземпляр модели будет готов сохранить с этим данные (доступные через $this->data).
Используется для сохранения значений отдельных полей. Просто установите ID ($this->Model Name?->id = $id) перед вызовом saveField(). Когда используете этот метод, то $fieldName должно содержать только имя поля, а не имя модели и поля.
Например, для обновления заголовка поста блога, вызов saveField из контроллера может выглядить так:
<? this->Post->saveField('title', 'A New Title for a New Day'); ?>
Обновляет много записей за один вызов. Записи, которые следует обновить определяются массивом $conditions, а поля для обновления, вместе с их значениями, – массивом $fields .
Например, для поощрения всех пекарей, которые работают больше года, update-вызов может выглядеть так:
<?
$this_year = date('Y-m-d h:i:s', strtotime('-1 year'));
$this->Baker->updateAll(
array('Baker.approved' => true),
array('Baker.created <=' => "$this_year")
);
?>