Доступ к Базе Данных и ORM

В 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 после названия таблицы. После того, как класс таблицы создан вы можете ссылаться на него, используя 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 для получения более подробной информации по использованию объектов таблиц и сущностей в вашем приложении.

Больше инфорации