Чтение данных
Чтение данных начинается с метода 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.