Doctrine优化n + 2个查询

时间:2017-06-30 20:22:13

标签: sql performance doctrine

我看过多篇关于如何在PHP Doctrine中优化n + 1查询的文章(例如,如何在对元素进行循环之前加载一个集合)。然而,优化n + 2个请求似乎不那么直接,我不确定Doctrine是否已经得到了我需要很好地处理这个案例的功能。

我在一个小应用程序上工作,在那里我实现了历史记录功能。 我们以Redmine的票证HTML页面为例。 我们有一个票证ID,我们想要显示:

  • 机票的数据
  • 其历史(周六下午5点,特德做了修改#5)
  • 其详细历史记录(修改#5包含2个更改(db中有2行):过去时间5 => 10小时,剩余时间:8 => 2小时)。
  • 其他数据,如评论等。

因此,我们希望能够构建历史简历列表,每个简历都包含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

欢迎您的帮助!

0 个答案:

没有答案