有没有办法只使用DQL(Doctrine查询语言)来获得下一个生日?我使用SQL函数DAYOFYEAR解决了这个问题,但我认为这不正确,因为它只适用于MySQL,如果我必须迁移到MSSQL(例如)不起作用。
先谢谢。
答案 0 :(得分:1)
你真的不需要MySQL的功能。只需使用PHP的date函数并使用格式“z”。引用PHP文档:
z - >一年中的某一天(从0开始) - > 0到365
或者,您也可以将strftime与“%j”(或其他任何适合您的人)一起使用
答案 1 :(得分:1)
我找到了一种通过在学说中使用原生查询来获得即将到来的生日的方法。 这是一个快速查询,根据http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/native-sql.html Doctrine在创建DQL查询时在内部以相同的方式使用ResultSetMapping。
这将在接下来的30天内找到所有生日。
请谨慎使用此方法,因为它会影响以后加载实体的方式。稍后在脚本中,只会为此实体加载添加到映射中的那些字段。我通过ajax加载了列表(并将其添加到会话中)
use Doctrine\ORM\Query\ResultSetMapping;
$rsm = new ResultSetMapping;
$rsm->addEntityResult('AppBundle:User', 'u');
$rsm->addFieldResult('u', 'id', 'id');
$rsm->addFieldResult('u', 'firstname', 'firstname');
$rsm->addFieldResult('u', 'lastname', 'lastname');
$rsm->addFieldResult('u', 'birthday', 'birthday');
$rsm->addFieldResult('u', 'image', 'image');
$query = $this->entityManager->createNativeQuery("
SELECT *
FROM user u
WHERE DAYOFYEAR(u.birthday)
BETWEEN DAYOFYEAR(CURDATE()) AND DAYOFYEAR(DATE_ADD(CURDATE(), INTERVAL ? DAY))
ORDER BY DAYOFYEAR(u.birthday) ASC
", $rsm);
$query->setParameter(1, '30');
$birthdays = $query->getResult();