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

编辑 一位用户说我可以尝试在 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 表达式。确保清理输入。

要将其显示为字段,您可以尝试将其添加到选项数组中的 fields 键中:

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

如果这不起作用,您可以随时尝试DboSource::rawQuery()不会逃脱任何东西,afaik。

于 2012-04-04T01:23:15.633 回答