簡體   English   中英

CakePHP使用LEFT JOIN和generate_series查找

[英]CakePHP find with LEFT JOIN and generate_series

基本上有可能,如果可以,那么如何在不使用CakePHP 2.0.6中的raw query()方法的情況下執行以下代碼。 我正在使用PostgreSQL( generate_series()是PostgreSQL的功能)。 那么,您如何使用CakePHP方式查詢呢?

$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);

編輯一位用戶說,我可以嘗試在Task上使用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

您可能正在尋找的是DboSource::expression() 它基本上允許您執行SQL表達式而無需Cake的任何轉義。 確保清理輸入。

要使其顯示為字段,可以嘗試將其添加到options數組中的fields鍵中:

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

如果那不起作用,您可以隨時嘗試DboSource::rawQuery() ,它不會轉義任何內容 ,即afaik。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM