Laravel 查询生成器 - 重用已修订的 where 语句的查询

2022-08-30 08:25:56

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

因此,我的代码使用一堆联接、where、排序、限制等来构建查询,然后运行查询。然后,我想做的是跳转到Builder对象并更改定义要查询的日期范围的where子句。

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

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

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

$this->data_qry->get();

虽然不起作用。查询仅使用原始日期范围运行。即使我的方式奏效了,我仍然不喜欢它,因为它似乎被一种不稳定的依赖性(某种耦合?)所击中。小如果日期没有首先设置,那么一切都会分崩离析。

我可以从头开始重新设置整个查询,只是使用不同的日期范围,但这似乎很糟糕,因为查询中的其他所有内容都需要与上次使用时相同。

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

谢谢

杰夫


答案 1

您可以使用 来复制查询,然后使用不同的 where 语句运行它。首先,在没有 from-to 约束的情况下生成查询,然后执行如下操作:clone

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

答案 2

@lukasgeiter使用克隆的建议绝对是要走的路。原因是 Eloquent\Builder 对象包含对需要复制的 Query\Builder 的内部引用。

为了保持应用程序的流程并返回到功能更强的样式,您可以使用Laravel的帮助程序,它只需返回传入的对象:with()

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

推荐