是否可以启动一个雄辩的查询,将其分配给一个变量然后继续使用该变量进行两个单独的查询,而不会相互冲突。一个简单的例子:
$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>
答案 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
您的用例太简单,无法克隆。 在执行大量方法链接时,它可能会帮助您干燥代码,尤其是在对查询应用过滤器时。