Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Сохранение и удаление

Чтобы добавить строку в таблицу, создают объект записи, заполняют его поля и передают таблице на сохранение. Изменение и удаление устроены так же: запись сначала получают, потом отдают таблице.

Создание записи

// 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.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.