php – 制定复杂的Doctrine2 DQL查询

鉴于我有一个具有许多AttendancePerson的Event($event)实例,我需要获取所有属于$event的AttendancePerson对象,其中AttendancePerson.person参加了多个具有calendar_id匹配$event-> calendar_id的事件以及AttendancePerson.event.dateTo在去年结束的地方.

架构减去不相关的列名称:

event_attendance_person
    - id
    - event_id
    - person_id
event
    - id
    - calendar_id
    - dateTo
person
    - id
event_calendar
    - id

目的是找到任何特定事件的旧成员.参加过去一年多次共享同一日历的活动的参加活动的人是活动的“老会员”.

我读了很多相关的问题.他们都没有帮助.感谢任何可以提供帮助的人.

最佳答案 为了满足您的特殊要求,让event_attendance_person中的人员在同一日历的过去一年中参加了超过1个事件,并提供了所提供事件的日历,因此在普通的Mysql查询中,您可以加入您的表格,获取每人ID不同事件的计数,即COUNT( DISTINCT e.id)和提供的事件id的条件计数让我说我想让那些参加了id为2228的事件的人因此对于这个起诉案件你可以这样做COUNT(例如,当e.id = 2228那么1 END)这将给你参加此活动的人的计数1和错过该事件的人的0,这个条件计数的原因是因为我没有使用事件id的过滤器我已经克服了这一个在过去的一年中,一个简单的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中将上面的查询复制的学说部分作为

$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是entityNamespaceYourBundle的别名:EventAttendencePerson,EventAttendencePerson实体必须指向您的Event实体,以便可以实现on ON(p.eventId = e.id)部分
> JOIN 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);
点赞