CakePHP 3.x 命令中的 case 语句
CakePHP 3.x case statement on order
我试图在 CakePHP 3.x 应用程序中按照 MySQL 语句的顺序使用 CASE 语句。简单的select如下:
$articles = $this->Articles->find()
->where($conditions)
->order(function ($exp, $q) {
return $exp->addCase(
[
$q->newExpr()->gt('Articles.modified', (new Time())->subDays(365)) // article has been updated in the last x days
],
['priority'], # values matching conditions
['string'] # type of each value
);
})
->limit(15)
->all();
生成如下SQL:
SELECT `Articles`.`id` AS `Articles__id`, ....
FROM `articles` `Articles`
WHERE (`publish` < :c0 AND `Articles`.`publish` > :c1)
ORDER BY CASE WHEN `Articles`.`modified` > :c2 THEN :param3 END LIMIT 15
case 语句不正确,因为它缺少应该在 'END' 之后的 DESC 顺序 - 请参阅此 fiddle:
http://sqlfiddle.com/#!9/8df161/5
我不确定这是否是 CakePHP 处理 CASE 的限制?
此外,我需要在 case 语句之后按 'publish' desc.
进行第二次排序
传递给 Query::order()
的表达式必须生成 ORDER BY
子句所需的所有内容,包括方向关键字。
如果您使用的表达式不支持,那么您可以使用 Query::oderAsc()
or Query::oderDesc()
,它会相应地附加相应的方向关键字。
$query = $this->Articles->find();
$query
->where($conditions)
->orderDesc(
$query->newExpr()->addCase(/* ... */)
)
// ...
另见
我试图在 CakePHP 3.x 应用程序中按照 MySQL 语句的顺序使用 CASE 语句。简单的select如下:
$articles = $this->Articles->find()
->where($conditions)
->order(function ($exp, $q) {
return $exp->addCase(
[
$q->newExpr()->gt('Articles.modified', (new Time())->subDays(365)) // article has been updated in the last x days
],
['priority'], # values matching conditions
['string'] # type of each value
);
})
->limit(15)
->all();
生成如下SQL:
SELECT `Articles`.`id` AS `Articles__id`, ....
FROM `articles` `Articles`
WHERE (`publish` < :c0 AND `Articles`.`publish` > :c1)
ORDER BY CASE WHEN `Articles`.`modified` > :c2 THEN :param3 END LIMIT 15
case 语句不正确,因为它缺少应该在 'END' 之后的 DESC 顺序 - 请参阅此 fiddle:
http://sqlfiddle.com/#!9/8df161/5
我不确定这是否是 CakePHP 处理 CASE 的限制?
此外,我需要在 case 语句之后按 'publish' desc.
进行第二次排序传递给 Query::order()
的表达式必须生成 ORDER BY
子句所需的所有内容,包括方向关键字。
如果您使用的表达式不支持,那么您可以使用 Query::oderAsc()
or Query::oderDesc()
,它会相应地附加相应的方向关键字。
$query = $this->Articles->find();
$query
->where($conditions)
->orderDesc(
$query->newExpr()->addCase(/* ... */)
)
// ...
另见