在Laravel中,如何将参数传递给BelongsToMany

时间:2019-02-07 01:29:27

标签: php laravel

我的用户模型中有此关系:

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()函数,并使其返回一个集合,就像在不带括号的情况下调用该函数一样?除了现在拥有两个功能之外,还有没有更好的方法?

1 个答案:

答案 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();