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(/* ... */)
    )
    // ...

另见