问题描述
以下是我查询的一部分,该查询根据特定格式的类似运算符进行过滤
$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 . '%')
];
}
);
另请参见