我看过多篇关于如何在PHP Doctrine中优化n + 1查询的文章(例如,如何在对元素进行循环之前加载一个集合)。然而,优化n + 2个请求似乎不那么直接,我不确定Doctrine是否已经得到了我需要很好地处理这个案例的功能。
我在一个小应用程序上工作,在那里我实现了历史记录功能。 我们以Redmine的票证HTML页面为例。 我们有一个票证ID,我们想要显示:
因此,我们希望能够构建历史简历列表,每个简历都包含html视图中的历史详细信息列表(列表列表)。 例如:
Ticket 37 : Title = "I need this feeeture", assigned time = "50 hours"
- History #1, Monday at 4am by Paul Gent
- Detail #1 : ticket title modified : "I need this feeeture" => "I need this feature"
- Detail #2 : ticket assigned time set to "5 hours"
- History #2 : Monday at 5 am by Paul Gent
- Detail #1 : ticket assigned time modified : "5 hours" => "50 hours"
- History #3 : ...
是否可以使用多个查询在同一$ ticket对象中加载所有这些数据? 如何在没有SQL结果的组合爆炸的情况下加载票证主数据,历史记录及其详细信息? 我想要Doctrine生成的3个查询如下:
1) Select * from ticket t where t.id = XXX;
2) Select * from ticket_history h where h.ticket_id = XXX
3) Select * from ticket_history_detail d where d.ticket_history_id in (5, 9, 10, 18, 66, 95)
or
3) Select d.* from ticket_history_detail d
inner join ticket_history h on d.ticket_history_id = h.history_id
where h.ticket_id = XXX
我想避免下一个查询,因为它生成了太多行:
1) Select t.*,h.*,d.* from ticket t
left join ticket_history h on h.ticket_id = t.id
left join ticket_history_detail d on d.ticket_history_id = h.history_id
where t.id = XXX
欢迎您的帮助!