Laravel 查询生成器-重用修改了 where 语句的查询

我的应用程序动态构建并运行复杂查询来生成报告。在某些情况下,我需要得到多个,有点任意的日期范围,与所有其他参数相同。

因此,我的代码使用大量连接、位置、排序、限制等构建查询,然后运行查询。然后我要做的是跳入 Builder 对象,并更改定义要查询的日期范围的 where 子句。

到目前为止,我已经使日期范围设置在任何其他 where 之前,然后尝试手动更改 where 数组的相关属性中的值。像这样

$this->data_qry->wheres[0]['value'] = $new_from_date;
$this->data_qry->wheres[1]['value'] = $new_to_date;

然后我做了(已经做过一次了)

$this->data_qry->get();

不过没用。该查询仅与原始日期范围一起运行。即使我的方法奏效了,我仍然不喜欢它,因为它似乎是以一种不稳定的依赖(某种形式的耦合?).即,如果日期,其中没有设置第一,然后一切崩溃。

我从头开始重新设置整个查询,只是使用了不同的日期范围,但是这似乎有点奇怪,因为查询中的其他所有内容都需要与前一次使用时相同。

任何关于如何以正确/整洁的方式实现这一目标的想法都是非常受欢迎的。

谢谢,

杰夫

38094 次浏览

可以使用 clone复制查询,然后使用不同的 where 语句运行它。首先,不使用 from-to 约束构建查询,然后执行以下操作:

$query1 = $this->data_qry;
$query2 = clone $query1;


$result1 = $query1->where('from', $from1)->where('to', $to1)->get();
$result2 = $query2->where('from', $from2)->where('to', $to2)->get();

@ lukasgeiter 提出的使用克隆的建议无疑是可行的; 原因是 Eloquent Builder 对象包含对需要复制的 Query Builder 的内部引用。

为了保持应用程序的流程并回归到一种功能性更强的样式,你可以使用 Laravel 的 with() helper,它只返回传入的对象:

$result1 = with(clone $this->data_qry)->where('from', $from1)->where('to', $to1)->get();
$result2 = with(clone $this->data_qry)->where('from', $from2)->where('to', $to2)->get();

对于那些希望语法更简单、更短的人来说,您可以在查询构建器上使用菊花链 clone()方法。

$result1 = $this->data_qry->clone()->where('from', $from1)->where('to', $to1)->get();
$result2 = $this->data_qry->clone()->where('from', $from2)->where('to', $to2)->get();