Торт PHP 3.x выписка из корпуса по заказу - PullRequest
0 голосов
/ 30 мая 2020

Я пытаюсь использовать оператор CASE порядка оператора MySQL в приложении Cake PHP 3.x. Простой выбор выглядит следующим образом:

$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 неверен, потому что в нем отсутствует порядок DES C, который должен стоять после 'END' - см. эту скрипку:

http://sqlfiddle.com/#! 9 / 8df161 / 5

Я не уверен, что это ограничение с как Cake PHP обрабатывает CASE?

Далее мне нужен второй порядок после оператора case, чтобы упорядочить по 'publi sh' des c.

1 Ответ

1 голос
/ 30 мая 2020

Выражения, переданные в Query::order(), должны генерировать все, что требуется предложением ORDER BY, включая ключевое слово direction.

Если выражение, которое вы используете, не поддерживает это, вы можете использовать Query::oderAsc() или Query::oderDesc(), что добавит соответствующее ключевое слово направления соответственно.

$query = $this->Articles->find();
$query
    ->where($conditions)
    ->orderDesc(
        $query->newExpr()->addCase(/* ... */)
    )
    // ...

См. также

...