Php 条令:如何编写一个“and where”,它只需要一个关系来匹配一个条件,但仍然查询其他关系?

Php 条令:如何编写一个“and where”,它只需要一个关系来匹配一个条件,但仍然查询其他关系?,php,doctrine,Php,Doctrine,好吧,我相信这是一个令人困惑的问题。让我试着更清楚地解释 问题: 模式很简单,本质上是: 我正在处理一个非常大的数据集,需要将所有内容编译成一个高效的查询。存在多个一对多关系,我正在尝试筛选数据集 我希望至少有一个与给定ID匹配的规则的事件的所有规则关联 例如,我有一个事件实体,它可以有零个或多个与之关联的描述符。我的用户的过滤器需要允许他们选择一个预处理器,并返回具有给定预处理器ID的所有事件。这很简单。但是我仍然需要列出其他的规则-我仍然需要查询其他的关系,但是至少需要1个关联来匹配给定的条

好吧,我相信这是一个令人困惑的问题。让我试着更清楚地解释

问题:

模式很简单,本质上是:

我正在处理一个非常大的数据集,需要将所有内容编译成一个高效的查询。存在多个一对多关系,我正在尝试筛选数据集

我希望至少有一个与给定ID匹配的规则的事件的所有规则关联

例如,我有一个事件实体,它可以有零个或多个与之关联的描述符。我的用户的过滤器需要允许他们选择一个预处理器,并返回具有给定预处理器ID的所有事件。这很简单。但是我仍然需要列出其他的规则-我仍然需要查询其他的关系,但是至少需要1个关联来匹配给定的条件

我希望这有点道理。一旦数据被查询,我总是可以对其进行过滤,但我希望避免获取不相关的数据,因为它是一个如此庞大的数据集

以下是我的代码片段:

        $qb->select($selectPartials)
       ->from('EventLegacy', 'e')
       ->leftJoin('e.site', 's')
       ->leftJoin('s.program_site_associations', 'psa')
       ->leftJoin('e.base', 'b')
       ->leftJoin('b.program_base_associations', 'pba')
       ->leftJoin('e.preceptor_associations', 'pa')
       ->leftJoin('pa.preceptor', 'pre')
       ->andWhere('e.program = ?3')
       ->andWhere('e.start_datetime >= ?1')
       ->andWhere('e.start_datetime <= ?2')
       ->andWhere('psa.active = true')
       ->andWhere('psa.program = ?3')
       ->andWhere('pba.active = true')
       ->andWhere('pba.program = ?3')
       ->andWhere('pre.id = ?4')
       ->orderBy('e.start_datetime')
       ->setParameter(1, $startDate)
       ->setParameter(2, $endDate)
       ->setParameter(3, $program)
       ->setParameter(4, $preceptorId);

        return $qb->getQuery()->getArrayResult();
等效的SQL查询:

SELECT *
FROM EventData e0_
LEFT JOIN AmbulanceServices a1_ ON e0_.site_id = a1_.AmbServ_id
LEFT JOIN ProgramSiteData p2_ ON a1_.AmbServ_id = p2_.AmbServ_id
LEFT JOIN AmbServ_Bases a3_ ON e0_.StartBase_id = a3_.Base_id
LEFT JOIN ProgramBaseData p4_ ON a3_.Base_id = p4_.Base_id
LEFT JOIN EventPreceptorData e5_ ON e0_.Event_id = e5_.Event_id
LEFT JOIN PreceptorData p6_ ON e5_.Preceptor_id = p6_.Preceptor_id
WHERE (e0_.Program_id = 287)
  AND (e0_.start_datetime >= ?)
  AND (e0_.start_datetime <= ?)
  AND (p2_.Active = 1)
  AND (p2_.Program_id = 287)
  AND (p4_.Active = 1)
  AND (p4_.Program_id = 287)
  AND (p6_.Preceptor_id = 179293)
ORDER BY e0_.start_datetime ASC
以下是一些可能有用的虚假数据

假设我总共有3个事件。身份证,姓名 1、事件 2、事件b 3、事件C

eventA有2个与之关联的描述符,eventB没有,eventC有1个。因此,我们的EventPreceptorData表有如下内容: id、事件id、训导器id 1,1,1 2,1,2 3,3,1

我们的受体-指导者数据可能看起来像这个id,名字 1、鲍勃 2,克里斯

因此,如果我在搜索Bob,我希望看到事件A和C,我希望我的输出是:

事件 导师:鲍勃,克里斯

事件B 导师:鲍勃


我的问题是克里斯没有被列入名单,考虑到我的问题,这是非常有意义的

将其编写为SQL查询并从那里向后转换为条令查询可能会有所帮助。即使在那个冗长的解释之后,我也不能完全理解你想要用来确定结果集的逻辑:-P可能会帮助你澄清你的想法。也让我想起了面板2的好,补充了一些更多的澄清。希望这有帮助:提前谢谢!当前丢失的其他数据来自哪个表?如果您使用MySQL并使用GROUP BY和GROUP_CONCAT发送原始查询以将规则数据连接到字符串中,则可能可以解决这个问题。当然,这可能不是您想要的,但这是一个开始-有一个条令扩展可以为您提供此功能,虽然我不能保证它是否真的有效。