鉴于我有一个包含许多 AttendancePerson 的 Event ($event) 实例,我需要获取属于 $event 的所有 AttendancePerson 对象,其中 AttendancePerson.person 参加了多个具有匹配 $event 的 calendar_id 的事件->calendar_id 以及 AttendancePerson.event.dateTo 在前一年结束的位置。
架构减去不相关的列名:
event_attendance_person
- id
- event_id
- person_id
event
- id
- calendar_id
- dateTo
person
- id
event_calendar
- id
目的是寻找任何给定事件的老成员。任何在上一年多次参加共享同一日历的事件的事件出席者是该事件的“老成员(member)”。
我通读了许多相关问题。他们都没有帮助。感谢任何可以提供帮助的人。
最佳答案
满足您对 event_attendance_person
人员的特殊要求谁在同一日历的过去一年中参加了超过 1 个事件到所提供事件的日历,因此在普通的 Mysql 查询中,您可以加入您的表,获取每个人 ID 的不同事件计数,即 COUNT(DISTINCT e.id)
并且对提供的事件 ID 的条件计数可以说我想得到参加过 ID 为 2228
的事件的人。所以对于这个起诉案件,你可以这样做COUNT(CASE WHEN e.id = 2228 THEN 1 END)
这将为参加此事件的人提供计数 1,为错过该事件的人提供 0,此条件计数的原因是因为我没有使用事件 ID 的 where 过滤器我已经通过使用 having 子句和 for过去一年一个简单的 where 子句是 WHERE e.dateTo < DATE_FORMAT(NOW() ,'%Y-01-01 00:00:00')
SELECT p.*,COUNT(DISTINCT e.id) total_events,
COUNT(CASE WHEN e.id = 2228 THEN 1 END) count_event
FROM `event_attendance_person` p
JOIN `event_event` e ON(p.`eventId` = e.id )
JOIN `event_calendar` c ON(e.`calendar` =c.`id`)
WHERE e.`dateTo` < DATE_FORMAT(NOW() ,'%Y-01-01 00:00:00')
GROUP BY p.`personId`
HAVING count_event = 1 AND total_events > 1
ORDER BY total_events DESC
你可以在你的 Mysql 服务器上测试这个查询
现在来了您可以在 DQL 中复制上述查询的 Doctrine 部分
$DQL="SELECT p,COUNT(DISTINCT e.id) AS total_events,
COUNT(CASE WHEN e.id = 2228 THEN 1 END) AS count_event
FROM NamespaceYourBundle:EventAttendencePerson p
JOIN p.events e
JOIN e.calandar c
WHERE e.dateTo < :dateTo
GROUP BY p.personId
HAVING total_events = 1 AND count_event >1
ORDER BY c DESC
";
对于上面的 DQL,我假设你已经映射了你的实体之间的关系,就像上面的查询一样,下面是你的实体中必须存在的强制关系
JOIN p.events e 现在 p 是实体
NamespaceYourBundle:EventAttendencePerson
的别名,EventAttendencePerson
实体必须指向您的Event
实体,以便在ON(p.eventId = e.id )
部分可以实现加入e.calandar c现在
Event
实体必须指向您的Calendar
实体以实现ON(e.calendar =c.id)
然后你可以使用 doctrine 的 paginator 类运行你的 DQL
use Doctrine\ORM\Tools\Pagination\Paginator;
$query = $DM->createQuery($DQL)
->setParameter('dateTo', date("Y-01-01 00:00:00"))
->setFirstResult(0)->setMaxResults(100);
$Persons = new Paginator($query, $fetchJoinCollection = true);
关于php - 制定复杂的 Doctrine2 DQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25518728/