【问题标题】:Add BINARY operator to CakePHP 3 query将 BINARY 运算符添加到 CakePHP 3 查询
【发布时间】:2016-07-26 19:53:54
【问题描述】:

我需要一个查询来区分大小写搜索字符串,因此我需要将MySQL BINARY operator 添加到查询中。

尝试以下操作时会出错:

$listing = $this->Listings
    ->find()
    ->where([
        'BINARY Listings.title' => 'alfred'
    ]);

同理:

$listing = $this->Listings->get($id, [
    'conditions' => [
        'BINARY Listings.title' => 'alfred'
    ]
]);

CakePHP 可以做到这一点(似乎不是这样) 还是我需要重写查询?

【问题讨论】:

  • 无论何时收到错误,请始终发布 complete 错误消息,包括 full 堆栈跟踪(最好从日志中正确复制可读时尚),即使问题对于熟悉 CakePHP 的人来说可能很明显!另外,请始终提及您的 exact CakePHP 版本并相应地标记您的问题 - 谢谢!

标签: mysql cakephp cakephp-3.0 query-builder case-sensitive


【解决方案1】:

您可以使用表达式来构建自定义 SQL。理想情况下,您应该创建一个自定义表达式类,以便在您切换方言时重复使用和转换以实现可移植性(请查看\Cake\Database\Dialect)。

使用CAST 函数

对于一些快速的事情,我会使用CAST 函数而不是BINARY 运算符(无论如何这是它的别名),它更便于开箱即用,并且在需要时更容易进一步移植。这是一个基本示例:

use Cake\Database\Expression\IdentifierExpression;
use Cake\Database\Expression\QueryExpression;

// ...

$listing = $this->Listings
    ->find()
    ->where(function (QueryExpression $exp) {
        $cast = $this->Listings
            ->query()
            ->func()
            ->cast([
                new IdentifierExpression('Listings.title'),
                'BINARY' => 'literal'
            ])
            ->tieWith(' AS ');

        return $exp->eq($cast, 'alfred');
    });

通用函数 epression 已更改为使用 AS 连接参数,因此您可以轻松地为函数提供标识符和类型部分。该列作为标识符表达式传递以支持自动标识符引用,您可能永远不需要它,但如果您不关心几微秒的额外编译时间,它不会受到伤害。

BINARY 运算符

为了完整起见,一个使用表达式添加二元运算符的简短示例:

function (QueryExpression $exp) {
    $binary = $this->Listings
        ->query()
        ->newExpr()
        ->tieWith(' ')
        ->add('BINARY')
        ->add([
            'Listings.title' => 'alfred'
        ]);

    return $exp->add($binary);
}

这应该是不言自明的,原始字符串 BINARY 和条件将使用空格绑定在一起。

另见

【讨论】:

    【解决方案2】:
     $listing = $this->Listings
    ->find()
    ->where([
        'BINARY (Listings.title)' => 'alfred'
    ]);
    

    可能只是缺少括号

    Cakephp 3 case sensitive query

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      • 2021-04-16
      • 2019-12-01
      • 2012-07-27
      • 2011-02-01
      • 2014-06-21
      • 2015-09-24
      相关资源
      最近更新 更多