2012-08-01 97 views
1

我有一个建设者,用于选择电话号码不是null,权限标记true(在第一次构建器调用中)以及在此函数中不包含生日模板null的人员。还有一个birthday场:Doctirne查询生成器,按生日过滤(使用DateTime)?

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。

回答

1

你可以使用原生sql,然后映射它以处理使用og ResultSetMapping的真实实体。诅咒,年份被忽略:

映射查询字段:

$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'); 

使用本地日期函数创建查询(每个所选列现在被映射):

​​

获取用户:

$users = $query->getResult(); 

提示:尽量避免铸造列值,当你想做一个查询。它强制MySQL(如果是你的情况)在执行比较和改变性能之前将列转换为CHAR。

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

+0

这就是我在没有阅读您的答案的情况下做的!谢谢!只是一个问题......用户可以分配给其他实体吗?我的意思是......这是一个“部分”的对象,理论会抱怨这个吗? – Polmonino 2012-08-01 19:51:34

+0

对象之间的关系是通过对其他实体的引用列来完成的,而这个值在部分/代理对象中保留不应该是一个问题。 – manix 2012-08-01 20:17:02