[英]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。 所以:
DATETIME
; \\DateTime
對象(字符串為YYYY-MM-DD格式) 哦,還有一件事:在你的where條件中使用IN表達式,它更加實用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.