【问题标题】:How to get first item of collection into DQL如何将第一个集合项放入 DQL
【发布时间】:2016-11-03 16:36:24
【问题描述】:

在我的数据库中,我有两张表 Booking 和 Week。 Booking 与 Week 具有一对多的关系。

进入一周我有一个“开始”和一个“结束”两个日期时间

我想选择所有在 45 天内开始的预订(编辑),但我不知道如何实现。

这是我写的:

$bookings = $doctrine->getRepository('MyBundle:Booking')
   ->createQueryBuilder('b')
   ->where('DATE_DIFF(CURRENT_DATE(), b.weeks) <= 45')
   ->getQuery()->getResult();

当然这不起作用,因为 b.weeks 是集合。而不是“周”,我需要获得第一周(也就是“开始”最低的一周)。

你能帮我做这件事吗?

PS:我无法执行 findAll 然后过滤,因为数据库中有超过 20.000 个预订......

【问题讨论】:

  • getFirstResult() 不适合您的情况?
  • 不,因为现在这个查询会抛出异常,因为我可以在日期和集合之间进行 date_diff。

标签: symfony dql


【解决方案1】:

你可以在开始日期时间的 where 加入周实体

$booking = $doctrine->getRepository('MyBundle:Booking')
   ->createQueryBuilder('b')
   ->join('b.weeks', 'w')
   ->where('w.start <= :start')
   ->setParameter(':start', new \DateTime('+45 days'))
   ->orderBy('w.start', 'ASC')
   ->getQuery()->getResult();

这会给你一个排序查询的第一个结果......我没有运行它来确保它工作......但它会给你一个想法......这解决了“周”的问题作为一个集合.. 使用这种方法,您可以从一周开始并设计一个与您的应用程序相匹配的逻辑。

【讨论】:

  • 我会尽快测试您的解决方案。我还做了一个小编辑,我想选择所有预订(不仅仅是一个)。我不知道您的解决方案是否适用于许多结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-25
  • 1970-01-01
  • 2019-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多