0

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');

問題は奇妙なスペースから来ていると思いますが、これを修正するために何をすべきか、またはそれらがどこから来たのかわかりません。:(

解決策のアイデアはありますか?前もって感謝します!

4

1 に答える 1