Два отношения laravel в одном вызове

#laravel #relationship

#laravel #отношения

Вопрос:

У меня есть таблица и модель Usercontract… и я могу вызывать usercontracts с такими отношениями, как это

 return UserContract
        ::with(['contracttax', 'contractproperty', 'persons', 'contractwarranty', 'users', 'contracts', 'tags'])
        ->orderBy('created_at', 'desc')->get();
  

Тогда у меня есть другая модель пользователя с этим методом.

 public function nonAcceptedContracts()
{
    return $this->belongsToMany(UserContract::class, 'invite', 'email', 'usercontract', 'email')->where('status', 'pending');
}
  

Есть ли способ вызвать это «nonAcceptedContracts» вместе с остальными отношениями из Usercontract? Итак, я получаю все результаты вместе в одной и той же переменной?

Комментарии:

1. Вы можете вызывать вложенные отношения, например ->with([..., 'users.nonAcceptedContracts']) . Это то, что вы ищете?

2. Это именно то, что я искал. Спасибо… Я просто вхожу в уже разработанный проект laravel, понятия не имея о laravel, хе-хе. Напишите ответ, чтобы я установил его как решение.

Ответ №1:

Laravel позволяет создавать цепочки отношений. В вашем случае вы хотите включить users отношения в свою UserContract модель и nonAcceptedContracts отношения в своей User модели. Просто используйте обозначение dot ( . ) для отношений:

 return UserContract::with([
  'contracttax',
  'contractproperty',
  'persons',
  'contractwarranty',
  'users.nonAcceptedContracts', // Note: This will include both `users` and `nonAcceptedContracts`
  'contracts',
  'tags'
])->orderBy('created_at', 'desc')
->get();
  

Теперь, при повторении ваших UserContract результатов, вы можете получить доступ users и nonAcceptedContracts :

 foreach ($userContracts as $userContract) {
  foreach ($userContract->users as $user) {
    // Do something with `$user->nonAcceptedContracts` ...
  }
}
  

См. https://laravel.com/docs/8.x/eloquent-relationships#nested-eager-loading для получения полной информации