Laravel 查询生成器 - 通过修改后的 where 语句重新使用查询
Laravel query builder - re-use query with amended where statement
我的应用程序动态构建和运行复杂查询以生成报告。在某些情况下,我需要获得多个,有点随意的日期范围,所有其他参数都相同。
所以我的代码使用一堆连接、wheres、排序、限制等构建查询,然后运行查询。然后我想做的是跳入 Builder 对象并更改定义要查询的日期范围的 where 子句。
到目前为止,我已将日期范围设置在任何其他 wheres 之前,然后尝试手动更改 wheres 数组的相关属性中的值。像这样;
$this->data_qry->wheres[0]['value'] = $new_from_date;
$this->data_qry->wheres[1]['value'] = $new_to_date;
那我做(已经做过一次了)
$this->data_qry->get();
虽然不起作用。查询仅在原始日期范围内运行。即使我的方法奏效了,我仍然不喜欢它,因为它似乎是通过一种不稳定的依赖(某种耦合?)来实现的。 IE;如果没有首先设置日期,那么一切都会分崩离析。
我可以从头开始重新设置整个查询,只是使用不同的日期范围,但这似乎很麻烦,因为查询中的其他所有内容都需要与上次使用它。
非常欢迎任何有关如何以正确/最简洁的方式实现此目的的想法。
谢谢,
杰夫
您可以使用 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()
帮助程序,它只是 returns 传入的对象:
$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();
我的应用程序动态构建和运行复杂查询以生成报告。在某些情况下,我需要获得多个,有点随意的日期范围,所有其他参数都相同。
所以我的代码使用一堆连接、wheres、排序、限制等构建查询,然后运行查询。然后我想做的是跳入 Builder 对象并更改定义要查询的日期范围的 where 子句。
到目前为止,我已将日期范围设置在任何其他 wheres 之前,然后尝试手动更改 wheres 数组的相关属性中的值。像这样;
$this->data_qry->wheres[0]['value'] = $new_from_date;
$this->data_qry->wheres[1]['value'] = $new_to_date;
那我做(已经做过一次了)
$this->data_qry->get();
虽然不起作用。查询仅在原始日期范围内运行。即使我的方法奏效了,我仍然不喜欢它,因为它似乎是通过一种不稳定的依赖(某种耦合?)来实现的。 IE;如果没有首先设置日期,那么一切都会分崩离析。
我可以从头开始重新设置整个查询,只是使用不同的日期范围,但这似乎很麻烦,因为查询中的其他所有内容都需要与上次使用它。
非常欢迎任何有关如何以正确/最简洁的方式实现此目的的想法。
谢谢,
杰夫
您可以使用 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()
帮助程序,它只是 returns 传入的对象:
$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();