【问题标题】:Symfony Doctrine Query Builder Where last in arraycollectionSymfony Doctrine Query Builder 数组集合中的最后一个位置
【发布时间】:2015-08-25 16:41:34
【问题描述】:

我想使用 symfony 的查询构建器并在数组集合中的最后一项添加位置

$query = $em->getRepository('RlBookingsBundle:Booking')->createQueryBuilder('b')
        ->select('b, v, c, ca, q')
        ->leftJoin('b.vehicle', 'v')
        ->leftJoin('b.customer', 'c')
        ->leftJoin('c.address', 'ca')
        ->leftJoin('b.quote', 'q')
        ->leftJoin('b.history', 'h') //This is an array collection
        ->orderBy('b.edited', 'DESC')
    ;

我只想使用历史记录中的最新值,因为它是一个日志,但只有最近的条目有效

->where('h.status IN (:status)')
  ->setParameter('status', [7]);

将返回 h.status = 7 的所有结果,但我希望它只查询最近的结果。有没有办法做到这一点?

我在历史字段上尝试了 groupby,但这似乎与第一个条目中的数据分组,即使我向其中添加了 orderby。

【问题讨论】:

  • 你有一个日期,你可以从中区分最近的记录吗?
  • 是的,历史记录行都有日期,或者 id 与每个最新条目将是最高的。理想情况下,我想 leftJoin 一个子查询,但我不认为教义可以处理这个问题。或者直接加入历史实体的最新结果。

标签: php symfony doctrine-orm doctrine arraycollection


【解决方案1】:

如果你得到的结果已经ok,但你只想要第一个,你可以使用

...
->setMaxResults(1)
...

如果您想按历史 ID desc 排序,您可能需要在现有的之前添加另一个 orderBy 子句

...
->orderBy('h.id', 'DESC')
->orderBy('b.edited', 'DESC')
...

如果它比这更复杂,我强烈建议您执行单独的查询以从历史记录中获取所需的记录,然后将其用作过滤器,而不是 leftJoin

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多