3

基本的に、それは可能ですか?可能であれば、CakePHP 2.0.6 で生の query() メソッドを使用せずに次のコードを実行するにはどうすればよいですか? 私はPostgreSQL(generate_series()の機能です)を使用しています。では、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);

EDIT あるユーザーは、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
4

1 に答える 1

1

おそらくあなたが探しているのは にありDboSource::expression()ます。基本的に、Cake のエスケープなしで SQL 式を実行できます。入力は必ずサニタイズしてください。

フィールドとして表示するには、 options 配列の fields キーに追加してみてください。

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

それがうまくいかない場合は、何もDboSource::rawQuery()エスケープしないものをいつでも試すことができます。

于 2012-04-04T01:23:15.633 に答える