如何将查询未来31天生日的SQL语句转换为CakePHP可用的查询格式
CakePHP 3.x / 4.x 实现代码
你可以直接用查询构建器的表达式方法实现,和原生SQL逻辑完全一致:
// 获取Membres表实例,控制器内使用如下写法,Table类中可直接调用$this $membresTable = $this->getTableLocator()->get('Membres'); $query = $membresTable->find() ->where(function (\Cake\Database\Expression\QueryExpression $exp, \Cake\ORM\Query $q) { // 生日区间查询条件,和你原生SQL逻辑完全相同 $rangeCondition = $q->newExpr(" DATE_ADD( date_de_naissance, INTERVAL YEAR(CURDATE()) - YEAR(date_de_naissance) + IF(DAYOFYEAR(CURDATE()) > DAYOFYEAR(date_de_naissance), 1, 0) YEAR ) BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 31 DAY) "); // 排除当日生日的条件 $excludeToday = $exp->or([ $exp->notEq( $q->func()->month(['date_de_naissance' => 'identifier']), $q->func()->month(['CURDATE()' => 'literal']) ), $exp->notEq( $q->func()->day(['date_de_naissance' => 'identifier']), $q->func()->day(['CURDATE()' => 'literal']) ) ]); return $exp->and([$rangeCondition, $excludeToday]); }); // 执行查询获取结果 $birthdayList = $query->all();
你可以通过debug($query->sql())打印生成的SQL语句,和你原生的SQL对比确认一致性。
CakePHP 2.x 实现代码
老版本CakePHP直接在conditions数组中写条件即可:
$this->loadModel('Membre'); $birthdayList = $this->Membre->find('all', [ 'conditions' => [ 'DATE_ADD( date_de_naissance, INTERVAL YEAR(CURDATE()) - YEAR(date_de_naissance) + IF(DAYOFYEAR(CURDATE()) > DAYOFYEAR(date_de_naissance), 1, 0) YEAR ) BETWEEN ? AND ?' => [ date('Y-m-d'), date('Y-m-d', strtotime('+31 days')) ], 'OR' => [ 'MONTH(date_de_naissance) <> MONTH(CURDATE())', 'DAY(date_de_naissance) <> DAY(CURDATE())' ] ] ]);
注意事项
- 上述写法没有用户输入参数,不存在SQL注入风险
- 如果开启了字段访问限制,需要确认
date_de_naissance字段在模型的可访问字段配置中
内容的提问来源于stack exchange,提问作者user12162496
相关产品推荐
相关产品推荐

