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 . '%')
];
}
);
另见
下面是我的查询的一部分,它基于特定格式的 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 . '%')
];
}
);
另见