Laravel – Динамические отношения, использующие hasManyThough () и уникальное слияние

Я могу придумать несколько специальных способов сделать это, но я действительно ищу решение для «лучших практик».

У меня 3 таблицы
– пользователи (user_id)
– использует ('user_id', 'provider_id', 'nurse_id', 'patient_id')
– usage_alerts ('usage_id')

Im пытается hasManyThrough() alerts загрузке с использованием hasManyThrough() на основе роли пользователя.

Поле user_id является агностиком и может применяться к любой роли, поэтому необходимо слияние и фильтрация.

Используя $this->hasManyThrough('UsageAlert', 'Usage')->get() вернет коллекцию, создав метод ->merge() . Однако при загрузке, при возврате, я получаю сообщение об ошибке, так как это объект коллекции.

 Call to undefined method Illuminate\Database\Eloquent\Collection::addEagerConstraints() 

Например, это мое текущее отношение (возвращает ошибку выше)

 public function alerts() { $alerts = $this->hasManyThrough('UsageAlert', 'Usage')->get(); if(Sentry::getUser()->inGroup(Sentry::findGroupByName('provider'))) $alerts->merge($this->hasManyThrough('UsageAlert', 'Usage', 'provider_id')); if(Sentry::getUser()->inGroup(Sentry::findGroupByName('patient'))) $alerts->merge($this->hasManyThrough('UsageAlert', 'Usage', 'patient_id')); if(Sentry::getUser()->inGroup(Sentry::findGroupByName('nurse'))) $alerts->merge($this->hasManyThrough('UsageAlert', 'Usage', 'nurse_id')); return $alerts; } 

Какие-либо предложения?
Возможно, слишком много сложностей для отношений?

Related of "Laravel – Динамические отношения, использующие hasManyThough () и уникальное слияние"

Лучшая практика манипулирует отношениями, хотя официальная документация о том, как недостает. Для вашего сценария вы можете union дополнительные запросы в первичные «агностические» отношения:

 $relation = $this->hasManyThrough('UsageAlert', 'Usage'); foreach (['provider','patient','nurse'] as $group) { if (Sentry::getUser()->inGroup(Sentry::findGroupByName($group))) { $relation->getBaseQuery()->union( $this-> hasManyThrough('UsageAlert', 'Usage', $group . '_id')-> getBaseQuery()-> select('UsageAlert.*') // limits union to common needed columns ); } } return $relation; 

Этот подход возвращает Relation , а не Collection , как ожидалось бы от пользователей API.