2013-02-12 68 views
0

我有一個返回我想要的結果的SQL語句,但是我需要分頁這些reults並已遇到問題在過去幾天試圖讓轉換爲$這個 - 查詢>分頁CakePHP的轉換SQL進行分頁

我正在與兩個有關係的表合作;項目和item_owns。 item_owns表包含3列:id,item_id和user_id,而items表包含id,collection_id和name。

SQL返回結果我需要:

SELECT it.id, it.name, COALESCE(count,0) as count 
FROM items as it 
LEFT OUTER JOIN (
    SELECT count(ito.item_id) as count, ito.item_id 
    FROM item_owns as ito 
    WHERE ito.user_id='4ffb9027-8c0c-4086-a13e-01a0cab1739a' 
    GROUP BY ito.item_id 
) as ct ON ct.item_id = it.id 
WHERE it.collection_id='4fc923f5-0a58-453f-9507-0c0c86106d80'; 

以下代碼段讓我接近,但是我最終不得不進行item_owns由USER_ID計數的PAGINATE功能,這意味着我的外部(由ITEM_ID分組)不能排序基於計數...

$this->paginate = array(
'limit' => 5, 
      'conditions' => array('Item.collection_id'=> $id), 
      'fields' => array('Item.id', 'Item.collection_id', 'Item.name'), 
      'contain' => array(
       'ItemOwn'=>array(
        'fields' => array('ItemOwn.id, ItemOwn.item_id, ItemOwn.user_id'), 
        'conditions' => array('ItemOwn.user_id' => $this->Session->read('Auth.User.id')), 

        ) 
       ) 
      ); 

我也嘗試過使用「加入」 =>陣列(),但不知道我是如何指定「計數」字段陣列中的通話

$this->paginate = array(
    'limit' => 5, 
    'fields' => array('Item.id', 'Item.collection_id', 'Item.name', 'count(ItemOwn.item_id)'), 
    'conditions' => array('Item.collection_id'=> $id, 'ItemOwn.user_id' => $this->Session->read('Auth.User.id')), 
    'joins' => array(
     array(
      'alias' => 'ItemOwn', 
      'table' => 'item_owns', 
      'foreign_key' => false, 
      'type' => 'LEFT OUTER', 
      'conditions' => array('ItemOwn.item_id = Item.id'), 
      'group' => 'ItemOwn.item_id' 
      ) 
     ) 
    ); 

我懷疑我可能需要使用自定義分頁功能,但我再次不知道在哪裏了一些連接和條件會去在...

任何想法是極大的讚賞! 謝謝 MK

回答

0

你正在使用包含哪些是好的,但你也應該使用Cake的counter cache爲計數。

+0

感謝您的回覆。我已經考慮過使用計數器緩存,但這意味着在我的數據庫中創建一個新表,因爲item_ow中可能有重複的item_id,每個item_id都有一個唯一的item_owns.id。這是因爲相同的物品可能會被用戶多次擁有,但它們是該物品的不同實例/副本。 – mk97 2013-02-12 12:49:51

+0

嗯,你可以嘗試創建你需要使用的表格之間的另一個臨時關係,同時計算哪些將用於該表格。就像在分頁之前使用bindModel()函數一樣。但我確實認爲,只要將其鏈接到HABTM連接表,即使在您的情況下,您仍然可以使用計數器緩存。 – 2013-02-13 23:11:34

+0

謝謝......會試試看。這可能是值得的創建新的表與計數器緩存的工作量,我似乎給這個:) ......正在考慮使用該新表作爲「父」item_owns表和我的原始item_owns包含所有「孩子」的項目,我可以計數所有的子項目瓦特/相同的父母id和存儲在父表中的計數。將會給一些更多的想法,並嘗試一些其他可能的選擇。再次感謝您的輸入! – mk97 2013-02-14 05:47:02