Вы читаете предварительную версию v0.1. API могут измениться.
~ 1 мин чтенияОбновлено 2026-10-29

Модели, связи и постраничная навигация

Elang Data — небольшой слой моделей и репозиториев поверх Doctrine DBAL. Он делает типовые операции с записями явными и не претендует на все возможности зрелой ORM.

Определение модели

php elang make:model Post --table=posts

Измените сгенерированный класс:

final class Post extends Elang\Data\Model
{
    protected const TABLE = 'posts';
    protected const FILLABLE = ['title', 'author_id', 'published'];
    protected const HIDDEN = ['internal_note'];
    protected const CASTS = ['id' => 'int', 'published' => 'bool'];
}

FILLABLE явно разрешает запись. Неожиданные поля отклоняются и не превращаются в случайные присваивания. HIDDEN исключает выбранные поля из JSON и массивов; он не заменяет авторизацию.

Чтение и запись

Внедрите Elang\Data\Models в свой сервис:

$posts = $models->of(Post::class);
$post = $posts->create(['title' => 'Hello', 'author_id' => 1, 'published' => 0]);
$mine = $posts->where('author_id', 1);
$mine->update($post->id, ['title' => 'A clearer title']);

Фильтры репозитория неизменяемы: where и orderBy возвращают новый репозиторий с ограниченной областью выборки. Ограниченные update и delete включают условия принадлежности записи в SQL-выражение. Вызов create должен соответствовать всем ограничениям равенства, уже применённым к репозиторию.

Безопасные идентификаторы и значения

Идентификаторы таблиц и столбцов должны быть простыми именами, контролируемыми приложением. Операторы и направления сортировки выбираются из разрешённых списков. Пользовательские значения привязываются как параметры. Не предоставляйте произвольные фрагменты SQL как управляемый пользователем вариант поиска или сортировки.

Постраничная навигация

$page = $posts->where('published', 1)->orderBy('id', 'DESC')->paginate(15, 1);

Paginator предоставляет items, total, perPage, currentPage и lastPage. Его JSON-представление содержит data и meta. PageRequest проверяет входящий номер страницы, а число записей на странице ограничено.

Связи

Связи представляют собой явные запросы, а не незаметную загрузку свойств:

$comments = $models->hasMany($post, Comment::class, 'post_id')->get();
$author = $models->belongsTo($post, UserProfile::class, 'author_id');

Для больших коллекций планируйте предварительную загрузку и количество запросов. Studio помогает изучать фактически выполненные запросы. Сейчас этот слой не предоставляет единицу работы, карту идентичности или автоматическое сохранение графа объектов.

Фабрики и классы наполнения

Factory принимает репозиторий и функцию определения данных. Он поддерживает ограниченное пакетное создание и переопределение значений. Классы наполнения реализуют Elang\Data\Seeder и запускаются через php elang db:seed 'App\Database\DemoSeeder'. Наполнение рабочей базы требует проверки и флага --force.

Нужна помощь?

Проверьте руководство по решению проблем, найдите термин в глоссарий, или пройдите полноценный проект доски задач.

Поиск по документации Elang

Начните вводить, чтобы найти следующий шаг.