簡體   English   中英

Doctrine Query無法按預期工作

[英]Doctrine Query doesn't work as expected

我正在使用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”

(我的db中的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');

我想這個問題來自於奇怪的空間,但我不知道該怎么做才能解決這個問題,或者說他們來自哪里。 :(

任何解決方案的想法? 提前致謝!

不要使用字符串來存儲日期。 特別是不喜歡這個。 如果您的查詢有效,它仍然會導致意外的東西,因為當匹配字符串時,它按字母順序工作。 因此,在您的情況下,您將在任何月份和任何一年的23日之后獲得所有日期。 因此,您需要將它們存儲為DATETIME才能解決此問題。 另一個問題是你需要在撇號之間放置$ start_date,因為它現在計算23-5-2013,即-1995。 所以:

  1. 將日期轉換為DATETIME ;
  2. 插入和查詢時使用\\DateTime對象(字符串為YYYY-MM-DD格式)

哦,還有一件事:在你的where條件中使用IN表達式,它更加實用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM