代码之家  ›  专栏  ›  技术社区  ›  Chris

laravel奇怪的查询行为[重复]

  •  0
  • Chris  · 技术社区  · 6 年前

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

    因此,我的代码使用一系列连接、where、sorts、limits等构建查询,然后运行查询。然后我想做的是跳转到Builder对象并更改where子句,它定义了要查询的日期范围。

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

    $this->data_qry->get();
    

    但没用。查询只是以原始日期范围运行。即使我的工作方式,我仍然不会喜欢它,虽然它似乎是通过一个不稳定的依赖(某种耦合?)。如果不先确定日期,那一切就完了。

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

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

    谢谢,

    杰夫

    0 回复  |  直到 9 年前
        1
  •  106
  •   lukasgeiter    9 年前

    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();
    
        2
  •  23
  •   Mark Boots    7 年前

    @lukasgeiter使用clone的建议绝对是可行的;原因是一个有说服力的\Builder对象包含一个需要复制的查询\Builder的内部引用。

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