首页 > 解决方案 > 在 Laravel 中如何将参数传递给 BelongsToMany

问题描述

我的用户模型中有这种关系:

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

标签: phplaravel

解决方案


使用方法而不是属性允许您构建查询。

$user->groups()->whereIn('role_id', [10, 15, 19])->get();

或者在使用急切加载获取用户时:

$users = User::with(['groups' => function($query) {
    return $query->whereIn('role_id', [10, 15, 19]);
}])->get();

推荐阅读