Laravel Pivot柱过滤

时间:2017-04-23 13:21:59

标签: php mysql sql performance laravel

我的代码:

$course   = Course::find(1);
$teachers = $course->Users()->where('role_id', 1)->get();
$students = $course->Users()->where('role_id', 2)->get();

在此解决方案中,我有两种不同的用户类型。 Users()函数是belongsToMany关系。

public function Users()
{
    return $this->belongsToMany(User::class, 'course_users')->withPivot('role_id');
}

我的course_users表列:user_id,course_id,role_id

此代码正常运行。

但是,当我查看查询时,我看到了两种针对这种情况的SQL查询。我想只使用一个查询,只将过滤后的值转换为合适的变量以获得性能。我该怎么办?

我试过下面的代码。但它只取得第一个变量$教师,而不是$ student。

$users    = $course->Users();
$teachers = $users->where('role_id', 1)->get();
$students = $users->where('role_id', 2)->get();

你的意见是什么? 谢谢。

2 个答案:

答案 0 :(得分:1)

如果只有一个查询很重要,您可以加载如下数据:

$users = $course->Users()->whereIn('role_id', [1, 2])->get();

然后使用该集合过滤数据:

$teachers = $users->where('role_id', 1);
$students = $users->where('role_id', 2);

答案 1 :(得分:-2)

感谢。我这样解决了。

$users = $course->Users()->whereIn('role_id', [1, 2])->get();
$teachers = $users->where('pivot.role_id', 1);
$students = $users->where('pivot.role_id', 2);