SLOT-H: Модели
Модель в системе - это класс, который представляет одну запись в таблице базы данных. Она наследуется от базового класса `Application\Assistance\Model` и содержит только объявление свойств, соответствующих полям таблицы.
Минимализм моделей
Модель не содержит логики. Она только объявляет свойства и наследуется от базового класса. Все геттеры, сеттеры и методы работы со связями находятся в базовом классе `Model`.
Пример модели:
php
<?php
namespace Modules\Blog\Models;
/**
* Post model class.
*
* Represents a post record.
*
* @package Modules\Blog\Models
*
* @method int getPostId()
* @method $this setPostId(int $post_id)
* @method string getPostText()
* @method $this setPostText(string $post_text)
* @method string getPostAuthor()
* @method $this setPostAuthor(string $post_author)
* @method int getPostTime()
* @method $this setPostTime(int $post_time)
*/
class Post extends \Application\Assistance\Model
{
/** @var int Primary key */
public $post_id;
/** @var string Post text */
public $post_text;
/** @var string Post author */
public $post_author;
/** @var int Post creation time */
public $post_time;
}
`PHPDoc для моделей
Рекомендуется добавлять PHPDoc-блоки с описанием всех геттеров и сеттеров. Это не влияет на работу системы, но делает код понятнее для разработчиков, а также позволяет IDE автоматически подсказывать доступные методы.
php
/**
* @method int getPostId()
* @method $this setPostId(int $post_id)
* @method string getPostText()
* @method $this setPostText(string $post_text)
* @method string getPostAuthor()
* @method $this setPostAuthor(string $post_author)
* @method int getPostTime()
* @method $this setPostTime(int $post_time)
*/
Все геттеры и сеттеры генерируются автоматически в базовом классе Model на основе названий полей. Для поля post_text создаются методы getPostText() и setPostText().
Связь с DbTables
Модель связана с DbTables через соглашение об именовании. Для модели Post используется DbTable Post в пространстве имён Modules\Blog\Models\DbTables.
Пример DbTable:
php
<?php
namespace Modules\Blog\Models\DbTables;
class Post extends \Application\Assistance\DatabaseExtend
{
const POST_ID = 'post_id';
const POST_TEXT = 'post_text';
const POST_AUTHOR = 'post_author';
const POST_TIME = 'post_time';
public static $_table = 'posts';
public static $_index = self::POST_ID;
public static $_fields = [
self::POST_ID => [],
self::POST_TEXT => [self::FP_TYPE => self::TYPE_TEXT],
self::POST_AUTHOR => [self::FP_TYPE => self::TYPE_STRING],
self::POST_TIME => [self::FP_TYPE => self::TYPE_INT],
];
}
`Базовый класс Model автоматически определяет, какой DbTable соответствует модели, и использует его для выполнения запросов.
Автоматические геттеры и сеттеры
Базовый класс Model предоставляет автоматические геттеры и сеттеры для всех полей, объявленных в модели.
php
$post->setPostText('Текст поста');
$text = $post->getPostText();
Геттеры и сеттеры формируются на основе названий полей. Для поля post_text создаются методы getPostText и setPostText.
Работа со связями
Модель поддерживает автоматические связи через методы link, lots и related.
linkField()
Получение связанного объекта (one-to-one).
php
$country = $person->linkCountryId();
Связь определяется по полю с суффиксом _id. В DbTable должно быть указано FP_LINK для этого поля:
php
self::COUNTRY_ID => [self::FP_LINK => \Modules\Geo\Models\DbTables\Country::class]
lotsFieldInModuleByField()
Получение коллекции связанных объектов (one-to-many).
php
$posts = $person->lotsPostInBlogByPersonId();
Метод формируется по шаблону: lots{Entity}In{Module}By{Field}.
relatedFieldInModuleByField()
Получение обратной связи (belongs-to).
php
$person = $post->relatedPersonInBaseByPostId();
Метод формируется по шаблону: related{Entity}In{Module}By{Field}.
Преобразование в массив
Модель может быть преобразована в массив через метод toArray().
php
$data = $post->toArray();
Метод возвращает ассоциативный массив всех полей модели с приведёнными типами.
Сохранение
Для сохранения модели используется метод save().
php
$post->setPostText('Новый текст')->save();
Метод возвращает идентификатор сохранённой записи.
Особенности
Имена свойств в модели должны совпадать с именами полей в таблице. Базовый класс Model использует reflection для определения доступных полей и генерации методов.
Если в модели не объявлено свойство, соответствующий геттер или сеттер не будет работать.
Модель может содержать дополнительные методы для специфической логики работы с данными, но в демо-версии они не требуются.
Что дальше?
- ➡️ Раздел 20. JSON-данные
- ➡️ Раздел 21. Типы контроллеров
- ➡️ Раздел 22. Структура фронтенд части