2012-04-18 41 views
0

列在我目前的應用程序中,我有一個戲劇列表,它幾乎普遍按查詢中的戲劇名稱排序。目前,它僅僅使用DB::select()語句來構建,但是當我們進行大量重構時,我們想要開始使用Kohana的ORM庫。問題來自於這樣的事實:我們通常不按實際播放名稱進行排序,而是根據處理後的版本進行排序,刪除文章等並按此排序(以便「摩門教之書」與Bs出現,而不是TS)。我不知道如何將它轉化爲ORM模型定義。Kohana 3.2 ORM與基於DB :: expr()

的選擇代碼如下(有刪節):

DB::select(column, column, 
     DB::expr("CASE WHEN SUBSTRING_INDEX(show_name, ' ', 1) IN ('a', 'an', 'the') 
       THEN SUBSTRING(show_name, INSTR(show_name, ' ') + 1) 
       ELSE show_name 
       END AS show_name_sort") 

有沒有一種方法來創建一個假show_name_sort列的Kohana將忽略保存,但我可以在order_by呼叫仍然使用?或者,我是否需要創建一個實際列,其中包含名稱的排序版本?

回答

0

這是可能的。您需要設置$_table_columns數組以反映所有列,但「假」列。假設表有3列:

  1. ID
  2. 描述

在你的模型,你應該重寫$_table_columns,所以ORM不會依賴SHOW FULL COLUMNS查詢:

class Model_Yourmodel extends ORM 
{ 
    protected $_table_columns = array(
      'id' => '', 
      'name' => '', 
     ); 

示例查詢可能如下所示:
ORM::factory('yourmodel')->order_by('description')->find_all()

這樣保存的方法也會忽略description列,因爲它沒有列在$_table_columns數組中。

+0

聽起來很有希望。我可以同時刪除完整的列查詢,從而減少一些無關的數據庫查詢。 ;)那麼如何將'DB :: expr()'調用傳遞給最初加載模型的查詢呢?或者這只是當我在實際表中有一個排序列時? – monksp 2012-04-20 16:00:18

+0

我不太明白你的意思,「我該如何將DB :: expr()調用傳遞給最初加載模型的查詢」。您的查詢應該保持完全一樣,但是您可以使用新的列進行排序。 – matino 2012-04-20 18:52:20

+0

我最初想做的事情是在加載orm模型的查詢中將原始問題包含在case語句中,而不是使用具有可排序名稱的額外列。 – monksp 2012-04-22 16:50:21