Php 条令查询不';I don’我没有按预期工作

Php 条令查询不';I don’我没有按预期工作,php,symfony,doctrine,Php,Symfony,Doctrine,我用的是Symfony2和条令。我有一个表单,用户在其中写入开始日期,并使用复选框选择一些类别。数据库表中的项目有日期字段和类别字段。我要做的是查询类别为选中类别且日期在所选开始日期之后的项目。所以我写了一个这样的方法: public function findForCatsAndTimes($user, $q) { $em = $this->getEntityManager(); $query = $em->createQuery('SELECT e FROM Ac

我用的是Symfony2和条令。我有一个表单,用户在其中写入
开始日期
,并使用复选框选择一些类别。数据库表中的项目有日期字段和类别字段。我要做的是查询类别为选中类别且日期在所选开始日期之后的项目。所以我写了一个这样的方法:

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\u 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)
当我变量dump
$start\u date
时: 字符串(10)“23-05-2013”

(数据库中的“我的开始日期”字段是字符串,而不是日期对象)

但当我看到Symfony Profiler中的DB查询时,我得到了以下结果:

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();
}
我猜问题来自于奇怪的空间,但我不知道该怎么做才能解决这个问题,也不知道它们来自哪里(


有什么解决方案吗?提前谢谢!

永远不要使用字符串来存储日期。尤其不是这样。如果你的查询有效,它仍然会导致意外的结果,因为在匹配字符串时,它是按字母顺序工作的。所以在你的情况下,你会得到任何月份和年份的23号之后的所有日期。所以你需要另一个问题是,你需要把$start_date放在撇号之间,因为现在它计算的是23-5-2013,也就是-1995。所以:

  • 将日期转换为
    DATETIME
  • 插入和查询时使用
    \DateTime
    对象(以及字符串的YYYY-MM-DD格式)

  • 哦,还有一件事:在where条件下使用表达式,这更实用。

    非常感谢您的回答!我的日期之所以是字符串,是因为在带有日期时间字段的表单中,Chrome会输出自己的日期选择器,我想避免它。但我想这还不够合理。我将使用datetime.:)
    $exp = $repo->findBetweenDates($this->user, '14-05-2013', '21-05-2013');