我需要能够在Doctrine中使用以下WHERE子句:
WHERE AL.UserID = 41 AND (TheDate BETWEEN DATE_SUB(CURDATE(), INTERVAL 2 WEEK) AND CURDATE())
我现在正在做的是:
$results = $em->getRepository('MyBundle:MyTable')->findOneBy(array('userId' => $userId));
但是,在过去的两周内,我还没有编写SQL或DQL来过滤结果。
我有什么方法可以通过Doctrine的方法实现这一目标吗?
答案 0 :(得分:1)
您可以使用QueryBuilder。假设您正在使用MySQL BETWEEN
,例如:
<?php
// $em instanceof EntityManager
$qb = $em->createQueryBuilder();
$now = new DateTime();
$qb->select('c')
->from('MyClass', 'c')
->where($qb->expr()->andX(
$qb->expr()->eq('c.UserID', '?1'),
$qb->expr()->gte('c.TheDate', '?2'),
$qb->expr()->lte('c.TheDate', '?3')
))
->setParameter(1, 41)
->setParameter(2, $now.sub(new DateInterval('P2W')))
->setParameter(3, $now);
$query = $qb->getQuery();
$c = $query->getSingleResult();
这是更干净的代码,应该可以在Doctrine2 ORM支持的不同数据库平台上运行。