基本上,是否可能,如果是这样,如何在不使用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
答案 0 :(得分: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。