Я могу придумать несколько специальных способов сделать это, но я действительно ищу решение для «лучших практик».
У меня 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; }
Какие-либо предложения?
Возможно, слишком много сложностей для отношений?
Лучшая практика манипулирует отношениями, хотя официальная документация о том, как недостает. Для вашего сценария вы можете 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.