0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Сущности предметной области существуют не сами по себе. Они часто зависят друг от друга. На уровне базы данных такие связи задаются через внешние ключи или даже промежуточные таблицы, как в случае связи "многие ко многим". ORM, в свою очередь, используют эти ключи, для работы со связями. Добавляет множество полезных методов, которые упрощают работу с зависимыми сущностями: выборкой, добавлением, модификацией и удалением.</p>
1
<p>Сущности предметной области существуют не сами по себе. Они часто зависят друг от друга. На уровне базы данных такие связи задаются через внешние ключи или даже промежуточные таблицы, как в случае связи "многие ко многим". ORM, в свою очередь, используют эти ключи, для работы со связями. Добавляет множество полезных методов, которые упрощают работу с зависимыми сущностями: выборкой, добавлением, модификацией и удалением.</p>
2
<p>Так как в этом курсе мы делаем блог, нам понадобится сущность<em>Post</em>. Пользователи связаны с постами "один ко многим":</p>
2
<p>Так как в этом курсе мы делаем блог, нам понадобится сущность<em>Post</em>. Пользователи связаны с постами "один ко многим":</p>
3
<ul><li>Один пользователь может быть автором многих постов</li>
3
<ul><li>Один пользователь может быть автором многих постов</li>
4
<li>У одного поста всегда один автор</li>
4
<li>У одного поста всегда один автор</li>
5
</ul><h2>Структура</h2>
5
</ul><h2>Структура</h2>
6
<p>Для поддержки такой связи при создании таблицы постов, нужно добавить внешний ключ на таблицу пользователей:</p>
6
<p>Для поддержки такой связи при создании таблицы постов, нужно добавить внешний ключ на таблицу пользователей:</p>
7
<p>По умолчанию Eloquent не воспринимает внешние ключи как что-то особенное. Она требует (как и большинство ORM) явного указания связи на уровне моделей. Для этого в каждой из моделей определяется специальный метод, через который будет происходить всё взаимодействие между связанными сущностями. Имя этого метода произвольно и выбирается так, чтобы лучше отражать суть связи: У поста есть автор, у каждого автора есть посты. Каждый такой метод должен вернуть вызов другого метода, отвечающего за связь. В примере ниже это belongsTo и hasMany.</p>
7
<p>По умолчанию Eloquent не воспринимает внешние ключи как что-то особенное. Она требует (как и большинство ORM) явного указания связи на уровне моделей. Для этого в каждой из моделей определяется специальный метод, через который будет происходить всё взаимодействие между связанными сущностями. Имя этого метода произвольно и выбирается так, чтобы лучше отражать суть связи: У поста есть автор, у каждого автора есть посты. Каждый такой метод должен вернуть вызов другого метода, отвечающего за связь. В примере ниже это belongsTo и hasMany.</p>
8
<p>Вторым параметром метод belongsTo ожидает имя внешнего ключа, по которому строится связь: $this->belongsTo('App\Models\User', 'creator_id'). Имя ключа можно не указывать, потому что Eloquent может сформировать его автоматически. В этом случае имя ключа сформируется по шаблону имя метода_id.</p>
8
<p>Вторым параметром метод belongsTo ожидает имя внешнего ключа, по которому строится связь: $this->belongsTo('App\Models\User', 'creator_id'). Имя ключа можно не указывать, потому что Eloquent может сформировать его автоматически. В этом случае имя ключа сформируется по шаблону имя метода_id.</p>
9
<p>Так происходит потому, что в Eloquent принято соглашение в именовании сущностей и методов. Подробнее об этом можно почитать в<a>документации</a>.</p>
9
<p>Так происходит потому, что в Eloquent принято соглашение в именовании сущностей и методов. Подробнее об этом можно почитать в<a>документации</a>.</p>
10
<p>Метод hasMany также поддерживает соглашение для определения имени внешнего ключа. Только здесь оно определяется не по имени метода, а по имени модели, в которой описывается связь. Для модели User это будет<em>user_id</em>. В нашем случае такая логика не работает, поэтому имя свойства указано явно.</p>
10
<p>Метод hasMany также поддерживает соглашение для определения имени внешнего ключа. Только здесь оно определяется не по имени метода, а по имени модели, в которой описывается связь. Для модели User это будет<em>user_id</em>. В нашем случае такая логика не работает, поэтому имя свойства указано явно.</p>
11
<h2>CRUD</h2>
11
<h2>CRUD</h2>
12
<p>Теперь Eloquent знает о связях и даёт работать с ними напрямую:</p>
12
<p>Теперь Eloquent знает о связях и даёт работать с ними напрямую:</p>
13
<p>Обращение к коллекции зависимых сущностей возвращает специальный объект, который может использоваться как массив.</p>
13
<p>Обращение к коллекции зависимых сущностей возвращает специальный объект, который может использоваться как массив.</p>
14
<p>Есть и другой способ взаимодействовать с зависимостями. Вызов постов как метода, позволяет управлять этой коллекцией, например удалить или добавить новый пост:</p>
14
<p>Есть и другой способ взаимодействовать с зависимостями. Вызов постов как метода, позволяет управлять этой коллекцией, например удалить или добавить новый пост:</p>
15
<p>То же самое происходит и с другой стороны связи:</p>
15
<p>То же самое происходит и с другой стороны связи:</p>
16
<p>При работе со связями важно переключиться от мышления через таблицы и ключи к сущностям и связям (<a>почему</a>). Технически это значит, что код опирается на сами сущности, а не их идентификаторы:</p>
16
<p>При работе со связями важно переключиться от мышления через таблицы и ключи к сущностям и связям (<a>почему</a>). Технически это значит, что код опирается на сами сущности, а не их идентификаторы:</p>
17
<h2>Выборки</h2>
17
<h2>Выборки</h2>
18
<p>Все типы связей в Eloquent поддерживают построение запросов на выборку:</p>
18
<p>Все типы связей в Eloquent поддерживают построение запросов на выборку:</p>
19
19