#mysql #database #laravel #eloquent
#mysql #База данных #laravel #красноречивый
Вопрос:
У меня есть пять моделей: User
, City
, State
, ResidencePivot
, PrivacyType
-
User
Модель имеетManyToMany
связь сCity
моделью черезresidences()
метод, использующийResidencePivot
Model -
City
Модель имеетOneToMany
связь сState
моделью черезstate()
метод (т.е.City => (BelongsTo) => State
) -
ResidencePivot
имеетOneToMany
связь сPrivacyType
моделью черезprivacyType()
метод (т.е.ResidencePivot => (BelongsTo) => City
)
Я вызываю отношения в User
модели следующим образом:
$user->load('residences.state')
Это дает мне все городские резиденции, в которых пользователь когда-либо жил, вместе со штатами, но я также хочу обеспечить конфиденциальность этих резиденций. Поскольку метод обеспечения конфиденциальности этих объектов находится в ResidencePivot
модели. Как я могу связать отношения в приведенном выше коде?
Любая помощь была бы оценена 🙂
Ответ №1:
Вы можете добавлять столько отношений, сколько хотите, пока они объявлены:
$user->load('residences.state','residences.privacyType')
Также вы также можете использовать ускоренную загрузку в зависимости от ситуации, если вы хотите загрузить все данные в том же запросе, в котором вы получаете пользователя:
$user = User::with('residences.state','residences.privacyType')->find($id);
Комментарии:
1. В вашем первом заявлении
residences.privacyType
выдается ошибка, потому что он не может найтиprivacyType()
метод вCity
модели. Помните, что он определен не вCity
модели, а вResidencePivot
модели, которая расширяетIlluminateDatabaseEloquentRelationsPivot
2. О, я понимаю, не могли бы вы опубликовать структуру вашей схемы в DB? Чтобы увидеть фактические столбцы. Вы также можете добавить дополнительный запрос для получения желаемых параметров:
User::with(['residences' => function($query) { $query->with('state')->addSelect(...your query to related table)}])->find($id);
3. На самом деле, я решил это 🙂 Метод сводной таблицы может быть вызван по
pivot
ключу сбора данных после извлеченияManyToMany
отношения