Doctirne查询生成器,按生日筛选(使用DateTime)



我有一个生成器,用于选择电话号码不是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 的双状态属性

相关内容

  • 没有找到相关文章

最新更新