c-g*_*fin 2 php laravel eloquent laravel-4
我可以想到几种特殊的方法来做到这一点,但我真的在寻找一种“最佳实践”类型的解决方案。
我有 3 个表涉及
- 用户 (user_id)
- 用法 ('user_id', 'provider_id', 'nurse_id', 'patient_id')
- usage_alerts ('usage_id')
我试着去渴望负荷alerts使用hasManyThrough()基于用户的角色。
该user_id字段是不可知的,可以应用于任何角色,因此需要进行合并和过滤。
Using$this->hasManyThrough('UsageAlert', 'Usage')->get()将返回一个集合,使该->merge()方法可用。但是,当急切加载时,返回时,我收到一个错误,因为它是一个集合对象。
Call to undefined method Illuminate\Database\Eloquent\Collection::addEagerConstraints()
Run Code Online (Sandbox Code Playgroud)
例如,这是我当前的关系(返回上面的错误)
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;
}
Run Code Online (Sandbox Code Playgroud)
有什么建议?
也许对于一段关系来说太复杂了?
最佳实践操纵了这种关系,尽管缺乏关于如何的官方文档。对于您的场景,您可以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;
Run Code Online (Sandbox Code Playgroud)
这种方法返回 a Relation,而不是CollectionAPI 用户所期望的 a 。