微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我如何在 CakePHP 3.9使用 Postgres的查询构建器中执行 ORDER BY xxxx DESC NULLS FIRST或 LAST

如何解决我如何在 CakePHP 3.9使用 Postgres的查询构建器中执行 ORDER BY xxxx DESC NULLS FIRST或 LAST

我写的..

$query->order([
    'updated_at' => 'DESC NULL LAST',]);

然后...

2021-04-07 16:34:58 Notice: Deprecated (16384): Passing extra sort expressions by associative array is deprecated. Use QueryExpression or numeric array instead. - /var/www/shokunin3/vendor/cakePHP/cakePHP/src/Database/Expression/QueryExpression.PHP,line: 173
 You can disable deprecation warnings by setting `Error.errorLevel` to `E_ALL & ~E_USER_DEPRECATED` in your config/app.PHP. in [/var/www/shokunin3/vendor/cakePHP/cakePHP/src/Core/functions.PHP,line 311]
Request URL: /hogehoge
Client IP: 192.168.1.1
Trace:
Cake\Error\BaseErrorHandler::handleError() - CORE/src/Error/BaseErrorHandler.PHP,line 168
deprecationWarning - CORE/src/Core/functions.PHP,line 311
Cake\Database\Expression\OrderByExpression::_addConditions() - CORE/src/Database/Expression/OrderByExpression.PHP,line 72
Cake\Database\Expression\QueryExpression::add() - CORE/src/Database/Expression/QueryExpression.PHP,line 173
Cake\Database\Query::_conjugate() - CORE/src/Database/Query.PHP,line 2260
Cake\Database\Query::order() - CORE/src/Database/Query.PHP,line 1191
App\Controller\FooController::bar() - APP/Controller/FooController.PHP,line 999
...

我该怎么写?

最新的 CakePHP 推荐什么方法

对不起,我的英语蹩脚...

解决方法

正如错误消息所暗示的那样,您可以为可以编写任意 SQL 的方向传递一个表达式:

$query->order([
    'updated_at' => $query->newExpr('DESC NULLS LAST'),]);
$query->order(function (\Cake\Database\Expression\QueryExpression $exp) {
    return [
        'updated_at' => $exp->add('DESC NULLS LAST'),];
});

或者您可以传递非关联数组条目,即单个字符串或表达式(但不支持自动标识符引用):

$query->order([
    'updated_at DESC NULLS LAST',]);
$query->order(function (\Cake\Database\Expression\QueryExpression $exp) {
    return [
        $exp->add('updated_at DESC NULLS LAST'),];
});

在任何情况下,请确保您不要在非关联值或表达式中插入用户数据,因为它们是按原样插入到查询中的,即它们很容易出现 SQL注射!

另见

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。