DoctrineでSymfony2を使用しています。ユーザーがチェックボックスでいくつかのカテゴリを書き込ん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 から 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();
}
このように呼び出されても問題なく動作します:
$exp = $repo->findBetweenDates($this->user, '14-05-2013', '21-05-2013');
問題は奇妙なスペースから来ていると思いますが、これを修正するために何をすべきか、またはそれらがどこから来たのかわかりません。:(
解決策のアイデアはありますか?前もって感謝します!