当前位置: 首页 > 面试题库 >

制定复杂的Doctrine2 DQL查询

越雨泽
2023-03-14
问题内容

假设我有一个事件($ event)实例,其中有许多AttendancePerson,则需要获取属于$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同一日历的过去一年参加过多个事件的人员到提供的事件的日历,因此在简单的Mysql查询中,您可以联接表以获取每个人的ID的不同事件的计数,即COUNT(DISTINCTe.id)和有条件的对提供的事件ID进行计数让我们说我想让参加事件的人员具有ID,2228因此对于这种起诉案件,您可以这样做,COUNT(CASEWHEN e.id = 2228 THEN 1END)这将使您为参加此事件的人员的计数为1,为参加事件的人员的计数为0错过该事件,此条件计数的原因是因为我没有使用事件ID的where过滤器,我已经通过使用Haves子句克服了这一问题,并且在过去的一年中,一个简单的where子句是
WHEREe.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,我假设您已经在实体之间映射了关系,例如下面的上述查询是您的实体中必须存在的强制性关系

  • 加入p.events e 现在p是实体的别名NamespaceYourBundle:EventAttendencePersonEventAttendencePerson实体必须指向您的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);


 类似资料:
  • NowCoder 题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的 head。 // java public class RandomListNode { int label; RandomListNode next = null; RandomListNode random =

  • 我有这个: 如何从hashlist中排除“item”?打破了我的头。Linq不想对我开放。

  • 问题内容: 我正在尝试查询Google BigQuery公共Reddit数据集。我的目标是使用Jaccards’Index来计算子reddit的相似性,该索引的定义如下: 我的计划是在2016年8月按评论数选择前N = 1000个子项,然后计算其笛卡尔积,以得到形状中所有子项的组合。 然后使用这些组合的行来查询subreddit1和subreddit 2之间的用户并集以及交集。 我到目前为止的查询

  • 问题内容: 表Words_Learned包含用户已知的所有单词以及 单词学习的顺序。它具有3列:1)单词ID和2)用户ID,以及3) 单词学习的顺序。 表中Article包含文章。它具有3列:1)文章ID,2) 唯一字数和3)文章内容。 该表Words包含每篇文章中包含的所有唯一单词的列表。 它有2列1)单词ID和2)文章ID 数据库图如下/ 在此处输入图片说明 您可以从此处下载数据库代码:htt

  • LCUI 实现了一些图形 API 用于解决组件的背景、边框和阴影的绘制问题。它们都依赖绘制上下文且都支持局部区域绘制,使得 LCUI 能够利用脏矩形机制和 OpenMP 并行渲染来提升渲染性能。 绘制背景 背景绘制参数被定义为LCUI_Background 结构体类型的对象,由 Background_Paint() 函数负责绘制。在下面的例子中,我们将画布中的区域 (200, 100, 400,

  • 一、题目 请实现函数ComplexListNode clone(ComplexListNode head),复制一个复杂链表。在复杂链表中,每个结点除了有一个next 域指向下一个结点外,还有一个sibling 指向链表中的任意结点或者null。 二、解题思路 在不用辅助空间的情况下实现O(n)的时间效率。 第一步:仍然是根据原始链表的每个结点N 创建对应的N’。把N’链接在N的后面。 第二步:设