Encodera

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

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

Оглавление

Чтение данных

Чтение данных начинается с метода find() класса таблицы. Он создаёт запрос, к которому по цепочке добавляют условия, сортировку и ограничение. Писать SQL не нужно — ORM составит его сам.

Все записи

// src/Controller/ArticlesController.php
public function index(): void
{
    $articles = $this->Articles->find()->all();
 
    $this->set(compact('articles'));
}

find() создаёт запрос, all() выполняет его и возвращает набор записей. В шаблоне по нему проходят циклом foreach.

Одна запись по номеру

public function view(int $id): void
{
    $article = $this->Articles->get($id);
 
    $this->set(compact('article'));
}

get() ищет запись по первичному ключу. Адрес /articles/view/1 покажет первую статью, а для несуществующего номера посетитель получит страницу 404 — проверять это самому не нужно.

Условия

$articles = $this->Articles->find()
    ->where(['published' => true])
    ->all();

Ключ массива — имя столбца, значение — то, чему он должен быть равен. Останутся только опубликованные статьи.

Другие сравнения записывают оператором после имени столбца:

УсловиеЧто означает
['views >' => 100]Больше 100
['title LIKE' => '%php%']Содержит «php»
['id IN' => [1, 2, 3]]Один из номеров
['body IS' => null]Пустое значение

Несколько условий одного массива соединяются через «И».

Сортировка и количество

$articles = $this->Articles->find()
    ->where(['published' => true])
    ->orderByDesc('created')
    ->limit(5)
    ->all();

Получатся пять самых свежих опубликованных статей. Для сортировки по возрастанию есть orderByAsc().

Первая запись

$article = $this->Articles->find()
    ->where(['title' => 'Первая статья'])
    ->first();

first() возвращает одну запись или null, если ничего не найдено. Метод firstOrFail() вместо null даёт страницу 404.

Подсчёт

$total = $this->Articles->find()->where(['published' => true])->count();

count() возвращает число — записи при этом не загружаются.

Только нужные столбцы

$titles = $this->Articles->find()->select(['id', 'title'])->all();
 
$list = $this->Articles->find('list')->toArray();

select() ограничивает набор столбцов. find('list') возвращает массив вида «номер — заголовок», удобный для выпадающих списков.

Свой метод поиска

Условие, которое нужно в нескольких местах, выносят в класс таблицы:

// src/Model/Table/ArticlesTable.php
use Cake\ORM\Query\SelectQuery;
 
public function findPublished(SelectQuery $query): SelectQuery
{
    return $query->where(['published' => true]);
}

В контроллере его вызывают по имени без приставки find: $this->Articles->find('published')->all().

Частая ошибка

first() может вернуть null, и обращение $article->title тогда закончится ошибкой. Либо проверяйте результат условием if ($article === null), либо пользуйтесь firstOrFail() и get() — они сами покажут страницу 404.

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

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