我的应用程序动态构建并运行复杂查询以生成报告。在某些情况下,我需要获得多个,有些任意的日期范围,所有其他参数都相同。
因此,我的代码使用一堆连接,数组,排序,限制等构建查询,然后运行查询。我当时想要做的是跳转到Builder对象并更改where子句,这些子句定义要查询的日期范围。
到目前为止,我已经做到了这样,以便在任何其他人之前设置日期范围,然后尝试手动更改wheres数组的相关属性中的值。像这样;
$this->data_qry->wheres[0]['value'] = $new_from_date;
$this->data_qry->wheres[1]['value'] = $new_to_date;
然后我做了(已经做过一次)
$this->data_qry->get();
虽然不起作用。查询只与原始日期范围一起运行。即使我的方式有效,我仍然不喜欢它,因为它似乎是以不稳定的依赖(某种耦合?)来拍摄的。即;如果没有先设置日期,则它们全部崩溃。
我可以从头开始重新设置整个查询,只是使用不同的日期范围,但这看起来很糟糕,因为查询中的其他内容需要与上次使用时相同。
如何以正确/最好的方式实现这一点的任何想法都是非常受欢迎的。
谢谢,
杰夫
答案 0 :(得分:49)
您可以使用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();
答案 1 :(得分:4)
@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();