php - 制定复杂的 Doctrine2 DQL 查询

标签 php mysql sql symfony doctrine

鉴于我有一个包含许多 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/

相关文章:

PHP MySQLi - 从具有绑定(bind)参数的查询中返回单个值?

mysql - 创建 View 的SQL语句

mysql - 在 MySQL 中使用子查询进行多次插入

sql - TSQL - 何时使用 'not null'

php - 如何更改 created_at 和 updated_at 值 laravel 的默认格式

javascript - 在ajax调用中传递计数器

php - 在 PHP 中用一个空格替换多个(仅内部)空格?

javascript - Ajax 连接到 php 中的函数失败

mysql - mysql如何垂直求和?

mysql - 使用 GROUP BY 仅对某些行进行分组