CakePHP 在查询中做自动小写

CakePHP doing auto lower casing in Query

下面是我的查询的一部分,它基于特定格式的 like 运算符进行过滤

$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 . '%')
        ];
    }
);

另见