我在PHP5.3的Symfony 1.4中使用Doctrine 1.2。我有一個數據庫,其中事件有多個開始日期時間(1:n)和類型(n:m)。學說在使用連接和偏移時跳過數據集
對於一個計劃,我希望的開始時間和事件的標題,這屬於一種特殊類型,而不是過時的列表:
$dql = Doctrine_Query::create()
->select('ed.start_datetime,e.title')/*edd.*,*/
->from('EventDate ed')
->leftJoin('ed.Event e')
->leftJoin('e.EventTypes et')
->leftJoin('e.Domain d')
->orderBy('ed.start_datetime, ed.event_id');
->where('e.start_datetime >= ? AND e3.id = ?',array('2011-05-27 17:19:41',2))
->fetchArray();
該模式可在pastebin.com/SdjvsaxW進行審查。
現在,學說使得兩個語句
SELECT DISTINCT e5.event_id FROM event_date e5 LEFT JOIN event e6 ON e5.event_id = e6.id LEFT JOIN event_event_type e8 ON (e6.id = e8.event_id) LEFT JOIN event_type e7 ON e7.id = e8.event_type_id WHERE (e5.start_datetime >= '2011-05-27 17:19:41' AND e7.id = '2') ORDER BY e5.start_datetime, e5.event_id
SELECT e.event_id AS e__event_id, e.start_datetime AS e__start_datetime, e2.id AS e2__id, e2.title AS e2__title FROM event_date e LEFT JOIN event e2 ON e.event_id = e2.id LEFT JOIN event_event_type e4 ON (e2.id = e4.event_id) LEFT JOIN event_type e3 ON e3.id = e4.event_type_id WHERE e.event_id IN (*all the IDs from the first query*) AND (e.start_datetime >= '2011-05-27 17:19:41' AND e3.id = '2') ORDER BY e.start_datetime, e.event_id
,當我介紹分頁的問題開始:當我加一個偏移量,它會在第一個查詢中添加。現在,由於可能有多個事件的開始時間,因此第一個SELECT DISTINCT查詢的ID數量可能會小於日期數量。因此,日期可能會被跳過。就我而言,甚至有不到50個不同的事件,所以第二頁顯示事件日期51-100確實是空的,儘管事實上有幾百個事件日期(由於重複發生的事件)。
我認爲這個問題可能會被解決,但我不能控制這個問題。
任何任何想法?
您的架構,請。此外,你試圖分頁的結果是什麼(例如EventDate或Event)? – Dziamid 2011-05-27 21:20:51
您是否在使用sfDoctrinePager進行分頁? – Pabloks 2011-05-27 23:55:27
請注意,您錯過了「?」從您的DQL中的WHERE子句開始。您可以通過在Doctrine原始SQL中寫入來擺脫DISTINCT。 – Tom 2011-05-28 00:26:14