我正在尝试查询当前月份的查询,这是我的查询:
$clients = $this->Clients;
$query = $clients->find();
if($this->Auth->user('role') !== 'admin'){
$query->where(['user_id =' => $this->Auth->user('id')]);
$query->where(['MONTH(dob) = ' => 'EXTRACT(month FROM (NOW()))']);
$query->order(['dob' => 'ASC']);
}
它返回0条记录(我的字段是日期类型),但phpmyadmin中的此查询有效:
SELECT * FROM `clients` WHERE MONTH(dob) = EXTRACT(month FROM (NOW()))
我做错了什么?
答案 0 :(得分:1)
只需查看实际生成的查询(查看您的DBMS查询日志,或尝试DebugKit),它看起来会有所不同,因为key => value
条件集中的右侧值受制于参数结合/铸造/报价/逸出。在你的情况下,它将被视为一个字符串,因此条件最终将类似于:
WHERE MONTH(dob) = 'EXTRACT(month FROM (NOW()))'
这当然不会与任何事情相提并论。
您可以将整个SQL片段作为单个数组值或表达式对象传递,这样就可以将其插入到查询中(不要以这种方式插入用户值,这会产生SQL注入漏洞! ),但我建议改用便携式函数表达式。
CakePHP附带EXTRACT
和NOW
的函数表达式,因此您可以执行以下操作:
use Cake\Database\Expression\IdentifierExpression;
use Cake\Database\Expression\QueryExpression;
use Cake\ORM\Query;
// ...
$query->where(function (QueryExpression $exp, Query $query) {
return $exp->eq(
$query->func()->extract('MONTH', new IdentifierExpression('dob')),
$query->func()->extract('MONTH', $query->func()->now())
);
});
看起来有点复杂,但它值得,它是跨DBMS便携式以及自动引用兼容。生成的SQL看起来像
WHERE EXTRACT(MONTH FROM (dob)) = (EXTRACT(MONTH FROM (NOW())))
另见