Вызов метода сводной модели в Laravel, связывающей отношения

#mysql #database #laravel #eloquent

#mysql #База данных #laravel #красноречивый

Вопрос:

У меня есть пять моделей: User , City , State , ResidencePivot , PrivacyType

  1. User Модель имеет ManyToMany связь с City моделью через residences() метод, использующий ResidencePivot Model

  2. City Модель имеет OneToMany связь с State моделью через state() метод (т.е. City => (BelongsTo) => State )

  3. 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 отношения