我的用户模型中有此关系:
public function groups() {
return $this->belongsToMany('\App\Group', 'role_in_group')
->orderBy('role_id', 'desc');
}
很明显,它返回用户所属的组。到目前为止,一切都很好。但是我有这个role_in_group数据透视表,我想获取用户所属的组,但是具有特定的角色,所以我编写了另一个函数:
public function groupsAsAdmin() {
return $this->belongsToMany('\App\Group', 'role_in_group')
->whereIn('role_id', [15, 18, 19])
->orderBy('role_id', 'desc');
}
它可以工作,但是我认为这是一个愚蠢的解决方案,我想做类似的事情:
public function groups(array $roles_id = NULL) {
if (empty($roles_id)) {
$id = [10, 15, 18, 19];
}
return $this->belongsToMany('\App\Group', 'role_in_group')
->whereIn('role_id', $id)
->orderBy('role_id', 'desc');
}
我知道,这必须可行。我的问题出在模板上。
如果我请求$user->groups
,它将返回我想要的集合,但是,如果我请求$user->groups([19])
,它将返回一个belongsToMany
对象,因此它将无法在内部工作@foreach
这将失败:
@foreach($user->groups([10, 15, 19]) as $group)
{{ $group->id }}<br>
@endforeach
那么,如何在模型中调用groups()
函数,并使其返回一个集合,就像在不带括号的情况下调用该函数一样?除了现在拥有两个功能之外,还有没有更好的方法?
答案 0 :(得分:1)
Using the method(而不是属性)允许您构建查询。
$user->groups()->whereIn('role_id', [10, 15, 19])->get();
或者在使用eager loading获取用户时:
$users = User::with(['groups' => function($query) {
return $query->whereIn('role_id', [10, 15, 19]);
}])->get();