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