Php 如何在Laravel中根据关系上的条件获取列表

Php 如何在Laravel中根据关系上的条件获取列表,php,laravel,laravel-4,Php,Laravel,Laravel 4,我有一个用户和角色实体,具有多对多关系。在我的角色表中,我有一个名为visible的列,它存储一个布尔值。如果某个用户的角色(至少有一个)不可见,我希望将其从结果集中排除 我可以在我的查询中获取相关的角色,然后通过迭代找到它们,但我真正想做的是让我的查询只返回所有可见角色的用户,而不是在查询之后过滤查询 比如: public function scopeVisible($query) { $query->whereHas('roles', function($q){ // an

我有一个用户角色实体,具有多对多关系。在我的角色表中,我有一个名为
visible
的列,它存储一个布尔值。如果某个用户的角色(至少有一个)不可见,我希望将其从结果集中排除

我可以在我的查询中获取相关的角色,然后通过迭代找到它们,但我真正想做的是让我的查询只返回所有可见角色的用户,而不是在查询之后过滤查询

比如:

public function scopeVisible($query)
{
  $query->whereHas('roles', function($q){
    // and here i want to find that thing out
  })     
}

我不熟悉Wherehads,但我想试试这样的

public function scopeVisible($query)
{
  return $query->whereHas('roles', function($q) {
    $q->where('visible', '=', true);
  });     
}

然后使用它:
$usersVisible=User::visible()->get()

让我们首先确定正在使用的表

user
    id - integer
    name - string

role
    id - integer
    visible - bool in the form of SMALLINT 0 or 1

user_role
    user_id - integer
    role_id - integer
我们将首先用普通的老SQL解决它。像这样:

SELECT * FROM user 
    INNER JOIN user_role ON user_role.user_id = user.id
    INNER JOIN role ON role.id = user_role.role_id
GROUP BY user.id
HAVING COUNT(user_role.user_id) = SUM(role.visible);
这里的关键是
HAVING
语句。我们对用户拥有的角色数量进行计数,然后对visible列进行求和。如果所有角色都可见,则用户与角色的关系量将等于可见角色的数量

现在把它转换成拉雷维尔语。为了做到这一点,我们必须使用Laravel的查询生成器

$visibleUsers = DB::table('user')
            ->join('user_role', 'user_role.user_id', '=', 'user.id')
            ->join('role', 'role.id', '=', 'user_role.role_id')
            ->groupBy('user.id')
            ->havingRaw('COUNT(`user_role`.`user_id`) = SUM(`role`.`visible`)')
            ->get();

好吧,一开始我也这么想,但事实并非如此。用户可以有多个角色,所以如果其中一个角色的可见性设置为“无”,则我希望将其排除在外。