Doctrine2 findOneBy参数等效于SQL中的BETWEEN

时间:2013-07-15 16:39:20

标签: symfony doctrine-orm

我需要能够在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的方法实现这一目标吗?

1 个答案:

答案 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支持的不同数据库平台上运行。