我正在使用Zend Framework 2并使用Doctrine查询语言。
我必须在用户列表页面上添加年龄过滤器。在数据库中,我使用日期格式存储了用户的出生日期。请帮助我如何使用where条件来应用我的过滤器。
$repository = $this->entityManager->getRepository('User\Entity\User');
$query = $repository->createQueryBuilder('u');
$query->where("(DATE_DIFF(CURRENT_DATE(), u.birth_date)/365)=".$search_arr['age']);
此查询未返回任何内容。原因可能是当我在mysql DATEDIFF( CURRENT_DATE( ) , u.birth_date ) /365
中运行它时,它返回浮点数,例如10.29。我需要将它转换为整数来进行比较。 Mysql提供 FLOOR 功能,但它在DQL中不起作用。
请帮我解决。
答案 0 :(得分:0)
以下公式为我做了诀窍:
if (today - 31 <= DOB >= today - 30) i am 30.
这就是DQL中的样子:
$age = intval($data['age']);
$startDate = new \DateTime('now');
$startDate->modify('-'.($age+1).' years');
$endDate = new \DateTime('now');
$endDate->modify('-'.$age.' years');
$from = new \DateTime($startDate->format("Y-m-d H:i:s"));
$to = new \DateTime($endDate->format("Y-m-d H:i:s"));
$qb = $this->getEntityManager()->createQueryBuilder();
$qb->select('p');
$qb->from('MyBundle:Person', 'p');
$qb->andWhere('p.dateOfBirth BETWEEN :from AND :to');
$qb->setParameter('from', $from);
$qb->setParameter('to', $to);
答案 1 :(得分:0)
$query->createQueryBuilder('u')->where(':year - substring(u.birthday,1,4) = :age and ((:month = substring(u.birthday,6,2) and :day >= substring(u.birthday,9,2)) or :month > substring(u.birthday,6,2)) or
:year - substring(u.birthday,1,4) - 1 = :age and ((:month = substring(u.birthday,6,2) and :day < substring(u.birthday,9,2)) or :month < substring(u.birthday,6,2))')
->setParameter('year', (new \DateTime('now'))->format("Y"))
->setParameter('month', (new \DateTime('now'))->format("m"))
->setParameter('day', (new \DateTime('now'))->format("d"))
->setParameter('age', $age);
日期格式Y-m-d