2012-01-12 80 views
1

我使用CakePHP 2.X版本CakePHP的傳遞自定義查詢從控制器到模型PAGINATE()

Im去運行SQL等:

SELECT field1, field2, field3, field3, 
      (IF(LOCATE('abc', field1), 4, 0) + IF(LOCATE('abc', field2), 3, 0) + IF(LOCATE('abc', field3), 2, 0)) AS score 
      FROM sometable 
      WHERE ((field1 LIKE '%abc%') OR (field2 LIKE '%abc%') OR (field3 LIKE '%abc%')) 
      ORDER BY score DESC 

由代碼生成此SQL動態。所以這個sql需要傳遞給paginate()函數,以便通過cakephp來完成分頁。看起來cakephp分頁功能不夠靈活,無法處理複雜的sql。

要執行這個複雜的SQL,我如何重寫paginate()來分頁我的結果?

描述:

我嘗試做自定義查詢分頁。 Controller獲取關鍵字並生成SQL,我想將SQL字符串傳遞給public function paginate(Model $model, $conditions, $fields, $order, $limi ...)函數,該函數在Model中被覆蓋以運行此自定義查詢。我怎樣才能將SQL字符串傳遞給分頁函數。

有什麼建議或提示嗎?

+0

您需要提供一些代碼來爲您正在做的事情提供某種上下文。我會告訴你,鑑於這個問題,你可能無法做你想做的事情。你在用什麼自定義查詢?由於自定義查詢往往只有在CakePHP無法完成的情況下才需要,因此很可能分頁函數也不會。您可能需要爲自定義查詢編寫自己的分頁。 – 2012-01-12 03:13:52

+0

@Scott Harwell謝謝你的回覆。我的問題是處理一些複雜的SQL,我想直接將SQL傳遞到paginate函數,而不是使用基本字段,條件參數。在我的情況下,我需要使用Model :: query()然後寫我自己的分頁?任何建議 – EeE 2012-01-12 03:44:03

+0

我無法真正提出建議,因爲我沒有答案的上下文。如果您提供查詢,那麼人們可以爲解決方案提出建議,因爲他們瞭解您想要處理的數據。 – 2012-01-12 03:55:34

回答

2

您的問題的簡短答案是,您無法通過此查詢爲您的數據分頁 - 或者,當完全使用計算字段時。正如您可能已經注意到的那樣,數據(尤其是計算的字段中的數據)不會返回到數組格式的數組中,這些數據格式爲data - >Model - >variable。而是作爲索引數組返回。

爲了在CakePHP的範圍內實現你想要做的事情,我將使用一個普通的查找來獲取實際存儲在表中的數據,並編寫一些Virtual Fields來執行你正在尋找的計算。然後,您可以基於虛擬字段進行分頁:

由於虛擬字段在執行find操作時的行爲與常規字段非常相似,Controller :: paginate()也可以通過虛擬字段進行排序。

相關問題