Сохранение и удаление
Чтобы добавить строку в таблицу, создают объект записи, заполняют его поля и передают таблице на сохранение. Изменение и удаление устроены так же: запись сначала получают, потом отдают таблице.
Создание записи
// src/Controller/ArticlesController.php
public function demo()
{
$article = $this->Articles->newEmptyEntity();
$article->title = 'Новая статья';
$article->body = 'Текст статьи.';
$this->Articles->save($article);
return $this->redirect(['action' => 'index']);
}newEmptyEntity() создаёт пустую запись, save() добавляет её в таблицу. Откройте /articles/demo — вы вернётесь к списку, и в нём будет новая статья. Столбцы id, created и modified заполнились сами.
Данные из массива
Данные формы приходят массивом. Переносит их в запись метод patchEntity():
$article = $this->Articles->newEmptyEntity();
$article = $this->Articles->patchEntity($article, [
'title' => 'Статья из массива',
'body' => 'Текст статьи.',
]);
$this->Articles->save($article);patchEntity() заполняет только поля, разрешённые в $_accessible класса записи, и заодно проверяет данные. На месте массива обычно стоит $this->request->getData().
Результат сохранения
if ($this->Articles->save($article)) {
// запись сохранена, её номер — $article->id
} else {
debug($article->getErrors());
}save() возвращает запись при успехе и false, если данные не прошли проверку. Причины лежат в getErrors(). Метод saveOrFail() вместо false бросает исключение.
Изменение
$article = $this->Articles->get(1);
$article->title = 'Новый заголовок';
$this->Articles->save($article);Тот же save() понимает, что запись уже есть в базе, и обновляет её. Отправляются только изменившиеся поля.
Удаление
$article = $this->Articles->get(1);
$this->Articles->delete($article);delete() возвращает true, если запись удалена.
Несколько записей одним запросом
| Вызов | Что делает |
|---|---|
updateAll(['published' => false], ['views' => 0]) | Меняет поля у всех подходящих записей |
deleteAll(['published' => false]) | Удаляет все подходящие записи |
Первый аргумент updateAll() — новые значения, второй — условие, как в where(). Эти методы не создают объектов и не выполняют проверку данных.
Частая ошибка
Поле, не перечисленное в $_accessible, метод patchEntity() молча пропускает — так посетитель не подставит в форму чужой user_id. Но если новое поле формы «не сохраняется», причина почти всегда здесь. Добавьте поле в $_accessible в src/Model/Entity/Article.php, а не открывайте всё записью '*' => true.