2012-04-03 83 views
2

基本上,它是可能的,如果是這樣,你如何在CakePHP 2.0.6中不使用原始查詢()方法的情況下執行以下代碼。我正在使用PostgreSQL(其中generate_series()是一個函數)。那麼,你如何做這個查詢CakePHP的方式?CakePHP find with LEFT JOIN和generate_series

$sql = " 
    SELECT new_rank FROM generate_series(1,999) AS new_rank 
    LEFT JOIN tasks ON tasks.rank = new_rank 
    WHERE tasks.rank IS NULL LIMIT 1 
"; 
$data = $this->Task->query($sql); 

編輯 一位網友說我可以嘗試使用find呼叫任務和右連接到generate_series()。這是我的嘗試。這段代碼會拋出一個錯誤,因爲CakePHP正在爲generate_series的函數參數放置雙引號。我想知道我該怎麼做到這一點?

$data = $this->Task->find('all', array(
    'conditions' => array('Task.rank' => null), 
    'limit' => 1, 
    'recursive' => -1, 
    'fields' => 'new_rank', 
    'joins' => array(
     array(
      'table'=>'generate_series(1,999)', 
      'alias'=>'new_rank', 
      'type'=>'RIGHT', 
      'conditions' => array(
      'tasks.rank'=>'new_rank' 
     ) 
    ) 
    ) 
)); 

該款產品的SQL語句:

SELECT "Task"."new_rank" AS "Task__new_rank" 
FROM "tasks" AS "Task" 
RIGHT JOIN generate_series("1,999") AS "new_rank" ON ("tasks"."rank" = 'new_rank') 
WHERE "Task"."rank" IS NULL LIMIT 1 
+0

對不起,我不知道任何CakePHP,但也許你可以從任務和RIGHT JOIN開始到你的'generate_series'。 – 2012-04-03 15:21:52

+0

這是一個好主意,我已經用我的嘗試更新了OP。不幸的是,CakePHP在1999年左右引用了一些引用。 – Pyrite 2012-04-03 15:46:07

+0

嗯,你可以指定'連接'作爲一個原始字符串?我仍然根據與其他ORM的經驗猜測。 – 2012-04-03 15:52:07

回答

1

什麼,你可能尋找的是在DboSource::expression()。它基本上允許你做一個沒有任何Cake的轉義的SQL表達式。確保清理輸入。

把它顯示爲一個字段,你可以嘗試將其添加到您的選擇陣列領域關鍵:

$ds = $this->Task->getDataSource(); 
$this->Task->find('all', array(
    'fields' => $ds->expression('generate_series(1,999) AS new_rank') 
)); 

如果不工作,你總是可以嘗試DboSource::rawQuery()這不逃脫任何東西,afaik。

+0

儘管這適用於'字段',但它不適用於連接參數中的'表'。我希望它能爲桌子工作。它看起來不像我可以嚴格執行這個Cake,所以我現在只是繼續使用Model-> query()。儘管爲了讓我走得最遠,我會給你這個獎勵。 – Pyrite 2012-04-05 21:11:22

+0

很遺憾,我們無法通過IRC中的ORM使其工作。 Welp,這有時會發生在框架:) – jeremyharris 2012-04-05 21:44:19