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

时间:2015-12-07 10:39:33

标签: php laravel laravel-5 eloquent

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

$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();

我一直认为我可以做前者,但我的一些结果似乎表明我不能,但我愿意相信,如果你能做到,那么也许我做错了。< / p>

3 个答案:

答案 0 :(得分:1)

一旦你这样做了:

$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构建器添加另一个where clasuse,从而导致查询构建器如下所示:

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

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

$student视为每次添加子句时修改的对象,因此可以将其用于渐进式查询构建,但请记住,一旦向查询构建器添加了子句,该对象已修改并且该子句将保留在构建器中,因此当您重新使用构建器时,它将包含您之前添加的所有clasuses

此外,Rembember当您需要为查询应用一些预定义的过滤器时,在Laravel中您应该使用query scopes

答案 1 :(得分:1)

当你打电话时

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

您正在创建一个查询构建器对象。在此对象上调用 where *()会通过添加给定条件来更新对象。因此,当您调用

时,无法在第一个代码段中实现您想要的效果
$masterStudents = $students
  ->where('course_id', 4)
  ->get();

当您 bachelorStudents 时,查询构建器已包含 where('course_id',3)约束。

答案 2 :(得分:0)

虽然每个人都在解释查询构建器及其工作原理,但这是您的答案。

1)开始XML::Twig

$parse("sample['ABC-DEF']").assign($scope, sample);

2)query builder我们单独查询的初始查询构建器

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

3)分配您的$bachelorStudentsQuery = clone $studentsQuery; $masterStudentsQuery = clone $studentsQuery; 条件并获得结果

where

您的用例太简单,无法克隆。 在执行大量方法链接时,它可能会帮助您干燥代码,尤其是在对查询应用过滤器时。