HTML Diff
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-&gt;belongsTo('App\Models\User', 'creator_id'). Имя ключа можно не указывать, потому что Eloquent может сформировать его автоматически. В этом случае имя ключа сформируется по шаблону имя метода_id.</p>
8 <p>Вторым параметром метод belongsTo ожидает имя внешнего ключа, по которому строится связь: $this-&gt;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