繁体   English   中英

将查询分配给变量,然后执行两个单独的查询?

[英]Assign a query to variable to then perform two separate queries?

是否可以启动一个雄辩的查询,将其分配给一个变量,然后继续将变量用于两个单独的查询,而又不会相互冲突。 一个简单的例子:

$students = $this->student
    // more query stuff
    ->where('is_active', 1);

$bachelorStudents = $students
    ->where('course_id', 3)
    ->get();

$masterStudents = $students
    ->where('course_id', 4)
    ->get();

还是我需要做:

$bachelorStudents = $this->student
    ->where('course_id', 3)
    ->get();

$masterStudents = $this->student
    ->where('course_id', 4)
    ->get();

我一直以为我可以做前者,但是我的一些结果似乎表明我做不到,但是我很开放地相信,如果您可以做到,那么我可能做错了。

完成后:

$students = $this->student->where('is_active', 1);

$stundents将包含带有where子句的查询构建器

如果您这样做:

$bachelorStudents = $students->where('course_id', 3)->get();

您将在$students构建器中添加另一个clasuse,这应该可以按预期工作

但是,当您这样做时:

$masterStudents = $students->where('course_id', 4)->get();

您要在同一个$students构建器中添加另一个clasuse,因此导致查询构建器如下所示:

$students->where('is_active', 1)
         ->where('course_id', 3)
         ->where('course_id', 4)
         ->get();

那可能不是您所期望的,因为您有2个where子句具有不同的course_id

可以将$student视为每次添加子句都可以修改的对象,因此可以将其用于渐进式查询构建,但是请记住,一旦向查询生成器中添加了子句,该对象就会被修改并且该子句将保持不变。在构建器中,因此当您重新使用构建器时,它将包含您先前添加的所有条款

另外,请记住,当您需要对查询应用一些预定义的过滤器时,在Laravel中应该使用查询范围

打电话时

$students = $this->student->where('is_active', 1);

您正在创建查询构建器对象。 调用此对象的where *()通过添加给定条件来更新对象。 因此,不可能在第一个代码段中实现所需的功能,因为调用时

$masterStudents = $students
  ->where('course_id', 4)
  ->get();

查询生成器已经包含bachelorStudents时添加的where('course_id',3)约束。

当每个人都在解释查询生成器及其工作原理时,这就是您的答案。

1)开始您的查询构建器

$studentsQuery = $this->student
            //Start a new query builder (optional)
            ->newQuery()
            ->where('is_active', 1);

2)将初始查询构建器克隆到我们的单独查询中

$bachelorStudentsQuery = clone $studentsQuery;
$masterStudentsQuery = clone $studentsQuery;

3)将您的where条件和得到的结果

$bachelorStudentsResult = $bachelorStudentsQuery->where('course_id', 3)
                        ->get();

$masterStudentsResult = $masterStudentsQuery->where('course_id',4)
                        ->get();

您的用例对于克隆来说太简单了。 当执行了很多方法链接时,特别是在将过滤器应用于查询时,它可以帮助您使代码干燥。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM