微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐