2016-05-07 13 views
0

私はSymfony2のホテルのウェブサイトを構築しています。各ホテルには、セルフケータリング、オールインクルーシブなど多くのボードベースのオプションが用意されています。DoctrineクエリWHERE IN - many to many

私の検索フォームには、場所、価格、星の評価、ボードの基準などのすべてのフィールドでフィルタリングできます。ボードベースは、複数選択チェックボックスです。ここで

ユーザーが複数のボードベースのオプションを選択すると、私は現在

$repo = $this->getDoctrine()->getRepository("AppBundle:Accommodation"); 

$data = $form->getData(); 

$qb = $repo->createQueryBuilder("a") 
     ->innerJoin("AppBundle:BoardType", "b") 
     ->where("a.destination = :destination") 
     ->setParameter("destination", $data['destination']) 
     ->andWhere("a.status = 'publish'"); 

if (count($data['boardBasis']) > 0) { 
    $ids = array_map(function($boardBasis) { 
     return $boardBasis->getId(); 
    }, $data['boardBasis']->toArray()); 

    $qb->andWhere($qb->expr()->in("a.boardBasis", ":ids")) 
     ->setParameter("ids", $ids); 
} 

(エラーを投げている)...この方法でそれを処理していますがホテルのエンティティ

のプロパティ宣言である
/** 
* @ORM\ManyToMany(targetEntity="BoardType") 
* @ORM\JoinTable(name="accommodation_board_type", 
*  joinColumns={@ORM\JoinColumn(name="accommodation_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="board_type_id", referencedColumnName="id")} 
*  ) 
*/ 
private $boardBasis; 
私は現在取得しています

エラーは次のとおりです。

[Semantical Error] line 0, col 177 near 'boardBasis I': Error: Invalid PathExpression. StateFieldPathExpression or SingleValuedAssociationField expected.

フォームを送信でそして、ボードタイプのvar_dumpを使用して、私は取得しています:

object(Doctrine\Common\Collections\ArrayCollection)[3043] 
    private 'elements' => 
    array (size=2) 
     0 => 
     object(AppBundle\Entity\BoardType)[1860] 
      protected 'shortCode' => string 'AI' (length=2) 
      protected 'id' => int 1 
      protected 'name' => string 'All-Inclusive' (length=13) 
      protected 'description' => null 
      protected 'slug' => string 'all-inclusive' (length=13) 
      protected 'created' => 
      object(DateTime)[1858] 
       ... 
      protected 'updated' => 
      object(DateTime)[1863] 
       ... 
     1 => 
     object(AppBundle\Entity\BoardType)[1869] 
      protected 'shortCode' => string 'BB' (length=2) 
      protected 'id' => int 2 
      protected 'name' => string 'Bed & Breakfast' (length=15) 
      protected 'description' => null 
      protected 'slug' => string 'bed-breakfast' (length=13) 
      protected 'created' => 
      object(DateTime)[1867] 
       ... 
      protected 'updated' => 
      object(DateTime)[1868] 
       ... 

が、私はこのクエリの正しい構文を見つけることができないよう、私は過去に数回行っている(そして、それは痛み毎時間だった)が、私はそれがどのように行われたか覚えていない。私はIDのマッピングなしで、ArrayCollectionを直接に渡しました。

createQueryを使用してDQLを使用して差異があるかどうかを確認してください。

この問題を持つ任意の助けをいただければ幸いでは、あなたが参加しているようですが、完全には完了していない私には見えます

+0

DQLの作業を知っていても、QueryBuilderを使用してDQLを実行する方法がわからない場合は、ここでDQLを投稿してください。そうしないと、より多くの情報(すべてのquerybuilder呼び出し)が必要になります。 – Miro

+0

DQLはもう1つのオプションです。私はquerybuilderの残りの部分を追加することができます。その非常に単純な – Scriptable

+0

あなたは属性boardBasisをホテルのエンティティに表示していますが、次にa.boardBasisを使用しています。これはAccomodationエンティティ? youreの式exprを()を使用している場合 – Miro

答えて

2

ありがとうございます。あなたは上の参加をどのフィールド記述の文が欠落していた。

$qb = $repo->createQueryBuilder("a") 
    ->innerJoin("AppBundle:BoardType", "b") 
    ->where("a.boardBasis = b.id") 
    ... 

それとも、そのように参加することができます:

$qb = $repo->createQueryBuilder("a") 
    ->innerJoin("a.boardBasis", "b") 
    ... 

を次にあなたがそうのようなあなたのWHERE INステートメントを追加行うことができます。

$qb->andWhere('b.id IN (:ids)') 
    ->setParameter('ids', $ids); 
+0

返事ありがとうございます。最初のものは同じエラーを投げ、下のものはクラッシュを引き起こしませんでしたが、どちらか私は恐れている – Scriptable

+0

申し訳ありませんが、私は私の答えを更新、それがあなたのために動作するかどうかを参照してください:) –

+0

私はそれを持っていると思う、ちょうど今テスト。更新:あなたの助けを借りて、うまく動作しているようです – Scriptable