如何从查询构建器中获取唯一关系?

时间:2019-04-10 09:26:48

标签: laravel laravel-query-builder

我需要选择模型查询集中存在的唯一关系集。我有带有表'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();
...

此代码返回我需要的集合,但是我想使用查询生成器来实现它,以利用独特的角色来提高速度

1 个答案:

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

集合和从集合中拔出的问题是,它必须遍历整个对象数组才能将字段拉出。如果那是一个大收藏,那将是非常昂贵的。

我尚未测试,但希望它能使您朝正确的方向前进。