[英]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.