我将 Symfony2 与 Doctrine 一起使用。我有一个表单,用户在其中编写start date
并选择带有复选框的某些类别。数据库表中的项目有日期字段和类别字段。我想要做的是从选中的类别中查询具有所选开始日期之后的日期的项目。所以我写了一个这样的方法:
public function findForCatsAndTimes($user, $q)
{
$em = $this->getEntityManager();
$query = $em->createQuery('SELECT e FROM AcmeBudgetTrackerBundle:Expense e WHERE e.user = ?1'.$q);
$query->setParameter(1, $user);
return $query->getResult();
}
为了在控制器中轻松编写不同的查询,而不是为每种情况创建 1000 个方法。
我将用户选择的类别放在一个名为$cats
. 并且在一个名为 的变量中选择日期$start_date
。
$query = '';
if( $start_date != ""){
$query .= ' AND (e.date > '.$start_date.')';
}
$query .='AND (e.category='.$cats[0];
array_shift($cats);
foreach ($cats as $c)
{
$query .= ' OR e.category='.$c;
}
$query .= ')';
$response = $repo->findForCatsAndTimes($this->user, $query);
这适用于类别,但不适用于日期。它只选择所选类别的所有项目,无论日期是什么。
我在执行时得到这个echo $query
:
AND (e.date > 23-05-2013)AND (e.category=48 OR e.category=49)
这当我 var_dump $start_date
: string(10) "23-05-2013"
(我在数据库中的 start_date 字段是字符串,而不是日期对象)
但是当我看到来自 Symfony Profiler 的数据库查询时,我得到了这个:
SELECT
e0_.id AS id0,
e0_.product AS product1,
e0_.description AS description2,
e0_.price AS price3,
e0_.date AS date4,
e0_.fos_user_id AS fos_user_id5,
e0_.category_id AS category_id6
FROM
expense e0_
WHERE
e0_.fos_user_id = ? AND (
e0_.date > 23 - 05 - 2013
) AND (
e0_.category_id = 48 OR e0_.category_id = 49
)
破折号之间有一些奇怪的空格:(
这个查询
public function findBetweenDates($user, $date1, $date2)
{
$q = $this
->createQueryBuilder('e')
->where('e.date >= :date1')
->andWhere('e.user = :user')
->andWhere('e.date <= :date2')
->setParameter('date1', $date1)
->setParameter('date2', $date2)
->setParameter('user', $user)
->getQuery();
return $q->getResult();
}
像这样调用工作正常:
$exp = $repo->findBetweenDates($this->user, '14-05-2013', '21-05-2013');
我猜这个问题来自奇怪的空间,但我不知道该怎么做才能解决这个问题,或者它们来自哪里。:(
任何解决方案的想法?提前致谢!