Laravel - 使用hasManyThough()和唯一合并的动态关系

时间:2014-08-30 00:44:23

标签: php laravel laravel-4 eloquent

我可以想到几种临时方法来做到这一点,但我真的在寻找“最佳实践”类型的解决方案。

我有3张桌子 - users(user_id)
- usages('user_id','provider_id','nurse_id','patient_id')
- usage_alerts('usage_id')

我试图根据用户的角色使用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;

}

有什么建议吗?
对于一段关系来说,复杂性太高了吗?

1 个答案:

答案 0 :(得分:3)

最佳实践操纵这种关系,尽管有关如何缺乏的官方文档。对于您的方案,您可以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用户所期望的那样。