我需要选择模型查询集中存在的唯一关系集。我有带有表'users'的模型User和带有表'roles'的模型Role,用户hasMany Role。
//User.php
public function roles()
{
return $this->belongsToMany(Role::class);
}
//Role.php
public function users()
{
return $this->belongsToMany(User::class);
}
我使用集合来管理它,但是它需要运行一个很大的查询,这会减慢整个请求的速度
//Controller
...
$users = User::query()->someChainOfScopes();
$uniqueRoles = $users->get()->pluck('roles')->flatten(1)->unique('id')->values();
...
此代码返回我需要的集合,但是我想使用查询生成器来实现它,以利用独特的角色来提高速度
答案 0 :(得分:0)
使用Laravel可以有几种不同的方法,
可以使用联接来在DB::table()
查询中联接2个表,然后使用所需的参数查找用户并返回role_id。
为了加快用户速度
$user_ids = DB::table('users')->select('id')->someChainOfScopes()->get();
您必须将链接范围更改为功能等的标准范围。
然后使用此数组直接查询role_user表
$role_ids = DB::table('role_user')
->select('role_id')
->whereIn('user_id', $user_ids)
->distinct()
->get();
集合和从集合中拔出的问题是,它必须遍历整个对象数组才能将字段拉出。如果那是一个大收藏,那将是非常昂贵的。
我尚未测试,但希望它能使您朝正确的方向前进。