PHP: Eloquent (ORM)
Теория: Связи
Сущности предметной области существуют не сами по себе. Они часто зависят друг от друга. На уровне базы данных такие связи задаются через внешние ключи или даже промежуточные таблицы, как в случае связи "многие ко многим". ORM, в свою очередь, используют эти ключи, для работы со связями. Добавляет множество полезных методов, которые упрощают работу с зависимыми сущностями: выборкой, добавлением, модификацией и удалением.
Так как в этом курсе мы делаем блог, нам понадобится сущность Post. Пользователи связаны с постами "один ко многим":
- Один пользователь может быть автором многих постов
- У одного поста всегда один автор
Структура
Для поддержки такой связи при создании таблицы постов, нужно добавить внешний ключ на таблицу пользователей:
По умолчанию Eloquent не воспринимает внешние ключи как что-то особенное. Она требует (как и большинство ORM) явного указания связи на уровне моделей. Для этого в каждой из моделей определяется специальный метод, через который будет происходить всё взаимодействие между связанными сущностями. Имя этого метода произвольно и выбирается так, чтобы лучше отражать суть связи: У поста есть автор, у каждого автора есть посты. Каждый такой метод должен вернуть вызов другого метода, отвечающего за связь. В примере ниже это belongsTo и hasMany.
Вторым параметром метод belongsTo ожидает имя внешнего ключа, по которому строится связь: $this->belongsTo('App\Models\User', 'creator_id'). Имя ключа можно не указывать, потому что Eloquent может сформировать его автоматически. В этом случае имя ключа сформируется по шаблону имя метода_id.
Так происходит потому, что в Eloquent принято соглашение в именовании сущностей и методов. Подробнее об этом можно почитать в документации.
Метод hasMany также поддерживает соглашение для определения имени внешнего ключа. Только здесь оно определяется не по имени метода, а по имени модели, в которой описывается связь. Для модели User это будет user_id. В нашем случае такая логика не работает, поэтому имя свойства указано явно.
CRUD
Теперь Eloquent знает о связях и даёт работать с ними напрямую:
Обращение к коллекции зависимых сущностей возвращает специальный объект, который может использоваться как массив.
Есть и другой способ взаимодействовать с зависимостями. Вызов постов как метода, позволяет управлять этой коллекцией, например удалить или добавить новый пост:
То же самое происходит и с другой стороны связи:
При работе со связями важно переключиться от мышления через таблицы и ключи к сущностям и связям (почему). Технически это значит, что код опирается на сами сущности, а не их идентификаторы:
Выборки
Все типы связей в Eloquent поддерживают построение запросов на выборку:

