好的,所以我确定这是一个非常令人困惑的问题。让我尝试更清楚地解释...
问题:
Schema 很简单,本质上是:
我正在处理一个非常大的数据集,需要将所有内容编译成 1 个有效的查询。有几个一对多的关系,我正在尝试“过滤”数据集。
我想要至少有 1 个与给定 ID 匹配的 preceptor 的事件的所有 preceptor 关联。
例如,我有一个“事件”实体,它可以有零个或多个与之关联的“指导者”。我的用户的过滤器需要允许他们选择一个“preceptor”并返回具有给定 preceptor 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 个事件。(id, name)
1, eventA
2, eventB
3, eventC
eventA 有 2 个 preceptor,eventB 没有,eventC 有 1 个。所以,我们的 EventPreceptorData 表应该是这样的:
(id, event_id, preceptor_id)
1,1,1
2,1,2
3, 3,1
我们的 prceptor (PreceptorData) 可能看起来像这样 (id, name)
1, Bob
2, Chris
因此,如果我正在搜索 Bob,我希望看到事件 A 和 C,并且我希望我的输出是:
eventA 导师
:鲍勃,克里斯
eventB 导师
:鲍勃
我的问题是“克里斯”没有被列出(考虑到我的查询,这非常有意义)。