1

我有一个构建器,用于选择电话号码 not 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')equals $today

任何人都知道如何使用查询生成器来做到这一点?我不想编写纯 SQL 查询,但我更喜欢重用其他查询生成器来干燥。

4

1 回答 1

1

您可以使用本机 sql 然后对其进行映射以处理使用 og 的真实实体ResultSetMapping。诅咒,YEAR 被忽略:

映射查询字段:

$rsm = new Doctrine\ORM\Query\ResultSetMapping;

    $rsm->addEntityResult('models\User', '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 并改变性能。

编辑生日列是日期时间类型。并且用户模型的 birtdate 属性映射为\DateTime object

于 2012-08-01T18:05:01.460 回答