CakePHP在查询中执行自动下划线

问题描述

以下是我查询的一部分,该查询根据特定格式的类似运算符进行过滤

$baseQuery->where(
     ["DATE_FORMAT(`CallRequests`.`updated_date`,'%m/%d/%Y %l:%i %p') like" => $string . '%'],['updated_date' => 'string']
);

但是由于某些原因 CakePHP在执行查询之前会自动降低%Y的作用

以下是调试转储查询中的相关部分:

DATE_FORMAT(`CallRequests`.`created_date`,'%m/%d/%y %l:%i %p') like :c0'

我知道可以使用原始查询来避免这种情况。

但是在不使用原始查询的情况下是否可以解决此问题?

解决方法

您不应该将SQL代码段放在key => value条件的键中。关键是保留一个标识符,并可选地包含一个由空格分隔的运算符。处理后,空白的右侧(即运算符部分)被小写,因此您正在体验。

您已经在使用原始SQL,因此,更进一步并使用单个值条件来提供完整的原始SQL代码片段并使用绑定来注入您的值并不是一个大飞跃:

$baseQuery
    ->where([
        "DATE_FORMAT(`CallRequests`.`updated_date`,'%m/%d/%Y %l:%i %p') like :date",])
    ->bind(':date',$string . '%','string');

或者,您可以将表达式用于DATE_FORMAT()函数和LIKE比较:

$baseQuery->where(
    function (
        \Cake\Database\Expression\QueryExpression $exp,\Cake\ORM\Query $query
    ) use ($string) {
        $dateFormat = $query->func()->DATE_FORMAT([
            $query->identifier('CallRequests.updated_date'),'%m/%d/%Y %l:%i %p'
        ]);

        return [
            $exp->like($dateFormat,$string . '%')
        ];
    }
);

另请参见