В CakePHP работа с Базой Данных осуществляется с помощью двух основных типов объектов. Первый тип - repositories (репозитории) или по другому table objects (объекты таблицы). Эти объекты предоставляют доступ к наборам данных. Они позволяют сохранять новые записи, редактировать/удалять существующие, определять отношения между данными и выполнять различные массовые операции. Второй тип объектов - entities (сущности). Сущности представляют собой конкретные отдельные записи таблицы и позволяют работать со строкой таблицы как с объектом.
Эти два класса несут ответсвенность почти за все, что связано с обработкой ваших данных, например валидация, взаимодействие с другими даными и управление информационными потоками данных в вашем веб-приложении.
CakePHP имеет встроенное объектно-реляционное отображение ORM позволяющее работать с реляционными Базами Данных, но, тем не менее, может быть раширен для поддержки других моделей данных.
Объектно-реляционное отображение заимствует идеи и концепции паттернов ActiveRecord и Datamapper. ORM реализует гибрид, который сочетает аспекты обоих паттернов, чтобы создать быстрое и легкое в использовании объектно-реляционное отображение.
Прежде чем начать изучать ORM, убедитесь что вы настроили соединение с БД.
Примечание
Если вы знакомы с предыдущими версиями CakePHP, вам следует прочитать Руководство по миграции на новую ORM чтобы понимать различия между CakePHP 3.0 и более старыми версиями CakePHP.
Чтобы начать вам не нужно писать какой либо дополнительный код по настройке Базы данных.
Если вы следуете CakePHP соглашениям Модели и Базы данных
то вы можете просто начать использовать ORM. Например если вы хотите получить данные
из таблицы articles
вы можете сделать это так:
use Cake\ORM\TableRegistry;
// Prior to 3.6 use TableRegistry::get('Articles')
$articles = TableRegistry::getTableLocator()->get('Articles');
$query = $articles->find();
foreach ($query as $row) {
echo $row->title;
}
Обратите внимание, мы не писали код который конфигурирует таблицу articles
.
Соглашения в CakePHP позволяют нам пропустить написание шаблонного кода фрэймворк будет
использовать базовые классы, если в вашем приложении еще не определены конкретные классы.
Если вы хотите настроить класс ArticlesTable, отвечающий за таблицу articles
добавив
в него отношения с другими таблицами или определить дополнительные методы, то необходимо
добавить в файл src/Model/Table/ArticlesTable.php после открывающего тега <?php
следующий код:
namespace App\Model\Table;
use Cake\ORM\Table;
class ArticlesTable extends Table
{
}
Классы таблиц именуются в ВерблюжемРегистре с постфиксом Table
после названия
таблицы. После того, как класс таблицы создан вы можете ссылаться на него,
используя ORM\TableRegistry
как и ранее:
use Cake\ORM\TableRegistry;
// Теперь $articles экземпляр класса ArticlesTable.
// Prior to 3.6 use TableRegistry::get('Articles')
$articles = TableRegistry::getTableLocator()->get('Articles');
Теперь, когда у нас есть конкретный класс таблицы, мы возможно захотим использовать
конкретный класс одной записи таблицы (сущности). Класс сущности позволяют определить
геттеры и сеттеры, добавить дополнительную логику и многое другое. Начнем с создания
класса src/Model/Entity/Article.php и добавления после тега <?php
следующего
кода:
namespace App\Model\Entity;
use Cake\ORM\Entity;
class Article extends Entity
{
}
Сущности именуются в ВерблюжемРегистре и содержат в названии имя таблицы в единственном числе, но уже без постфикса Table. Ниже мы создали класс таблицы и загрузили сущности из таблицы. Теперь получим объекты сущностей таблицы Article:
use Cake\ORM\TableRegistry;
// $articles объект класса ArticlesTable.
// Prior to 3.6 use TableRegistry::get('Articles')
$articles = TableRegistry::getTableLocator()->get('Articles');
$query = $articles->find();
foreach ($query as $row) {
// Каждая строка $row теперь объект класса сущности Article.
echo $row->title;
}
CakePHP использует соглашения именования для того, чтобы чтобы связать вместе классы
таблицы и сущности. Если вым необходимо настроить какая сущность использется классом
таблиц вы можете использовать методы setEntityClass()
или EntityClass()
для
установки специфического имени класса.
Смотрите главы Табличные объекты и Entities для получения более подробной информации по использованию объектов таблиц и сущностей в вашем приложении.