【问题标题】:How to pluck unique relationships from query builder?如何从查询构建器中提取独特的关系?
【发布时间】:2019-08-31 17:04:02
【问题描述】:

我需要提取模型查询集中存在的唯一关系集。我有表“用户”的模型用户和表“角色”的模型角色,用户有很多角色。

//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();
...

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

【问题讨论】:

  • 你能发布你期望的最终结果吗
  • 我希望在执行 Role::find([1,2,3]) 时获得角色集合。

标签: laravel laravel-query-builder


【解决方案1】:

使用 Laravel 有几种不同的方法可以做到这一点,

Join 可以是在 DB::table() 查询中加入 2 个表的选项,然后使用您需要的参数查找用户并返回 role_id。

加速用户

$user_ids = DB::table('users')->select('id')->someChainOfScopes()->get();

您必须将链式作用域更改为标准 where 函数等。

然后使用这个数组直接查询role_user表

$role_ids = DB::table('role_user')
                ->select('role_id')
                ->whereIn('user_id', $user_ids)
                ->distinct()
                ->get();

集合和从集合中提取的问题是它必须遍历整个对象数组才能拉出一个字段。如果这是一个大集合,那么成本会非常高。

我没有测试过,但希望它能让你朝着正确的方向前进。

【讨论】:

  • 尝试了您的想法并提高了速度,但是 $users->pluck('id') 也在将大量数据提取到内存中。它适用于当前数量的用户,但当数据库包含更多用户时会导致内存溢出
  • 我已经再次更新,因为我不记得你是否可以在 eloquent 模型上进行选择。所以我们再次使用 DB::table 方法。无论如何,我认为这可能是稍微好一点的性能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-30
  • 2013-05-02
  • 2021-12-30
  • 1970-01-01
  • 2019-04-24
  • 1970-01-01
  • 2019-12-09
相关资源
最近更新 更多