我有一个生成器,用于选择电话号码不是null
、权限标志true
(在第一个生成器调用中)以及生日模板不是null
的人。还有一个birthday
字段:
public function getAllForBirthdaySmsSend()
{
$qb = $this->getAllSuitableForSmsQueryBuilder();
$alias = $qb->getRootAlias();
$today = new DateTime();
return $qb->andWhere(
$qb->expr()->andX(
$qb->expr()->isNotNull("$alias.sms_birthday_template"),
/* Filter if today is his birthday */
))
;
}
现在,我应该根据生日来筛选人员,也就是说,如果生日列格式为'm-d-' . date('Y')
等于$today
。
有人知道如何使用查询生成器做到这一点吗?我不想写纯SQL查询,但我更喜欢重用其他查询生成器DRY。
您可以使用本机sql,然后对其进行映射,以便处理使用og ResultSetMapping
的真实实体。诅咒的年份被忽略:
映射查询字段:
$rsm = new DoctrineORMQueryResultSetMapping;
$rsm->addEntityResult('modelsUser', 'u');
$rsm->addFieldResult('u', 'id', 'id');
$rsm->addFieldResult('u', 'username', 'username');
$rsm->addFieldResult('u', 'birthday', 'birthday');
使用本机日期函数创建查询(现在每个选定列都已映射):
$query = $this->doctrine->em->createNativeQuery('
SELECT id, username, birthday
FROM user
WHERE TIMESTAMPDIFF(YEAR, birthday, CURRENT_DATE)
> TIMESTAMPDIFF(YEAR, birthday, CURRENT_DATE - INTERVAL 1 DAY)', $rsm);
获取用户:
$users = $query->getResult();
提示:在执行查询时,尽量避免强制转换列值。它强制MySQL(如果是您的情况)在执行比较之前将列转换为CHAR并更改性能。
编辑生日列为日期时间类型。并且用户模型具有映射为DateTime object
的双状态属性