【问题标题】:Laravel Pivot Column FilteringLaravel 透视列过滤
【发布时间】:2023-03-26 06:38:01
【问题描述】:

我的代码:

$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 查询。我只想使用一个查询并仅将过滤后的值获取到合适的变量以提高性能。我该怎么做?

我尝试了下面的代码。但它只获取第一个变量 $teachers,而不是 $students。

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

你的意见是什么? 谢谢。

【问题讨论】:

    标签: php mysql sql performance laravel


    【解决方案1】:

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

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

    然后使用集合过滤数据:

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

    【讨论】:

    • 我试过了,$users 获取了 3 个项目。但是 $teachers 和 $students 项目是空的。还有什么问题?
    【解决方案2】:

    谢谢。我是这样解决的。

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

    【讨论】:

      猜你喜欢
      • 2017-10-17
      • 2014-07-22
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 2019-09-17
      • 2012-08-25
      • 2016-01-10
      • 2018-11-24
      相关资源
      最近更新 更多