2016-12-12 4 views
0

私は、説明、名前などが複数の言語で別の表に保存されている製品を持っています。 1つの製品は複数の翻訳(製品データ)を持つことができます。Symofny2 Query Builder leftJoin with many relationship

現在、私は、製品のすべての翻訳を取得し、ロケールに基づいて必要な翻訳を取得するにはforeachのとIFSを行う...多くの言語がある場合にはサイクルが大きくて醜いなり...

私が欲しいですロケールに基づいて、クエリから必要な変換データのみを取得します。私はこのクエリをしていますが、それは動作しません:

$query = $this->createQueryBuilder('p') 
     ->select([ 
      'p', 
      'pt', 
      'lang', 
     ]) 
     ->leftJoin('p.translations', 'pt', 'with', 'pt.language.iso = :locale') 
     ->leftJoin('pt.language', 'lang') 
     ->where("p.status = 1") 
     ->SetParameter('locale', $locale) 
     ->add('orderBy','p.position ASC'); 
return $query->getQuery()->getResult(); 

これは私が試したの選択肢の一つであり、私はこれは私が解決策に到達する最も近いと思うが、私はエラーを取得:

[Semantical Error] line 0, col 281 near 'iso = :locale': Error: Class Mp\ShopBundle\Entity\ProductLanguageData has no field or association named language.iso 

エラーはそれをすべて言っていますが、私はこれを修正する方法を理解できません。どんな援助も感謝します。

+0

まず、製品を選択し、左結合の代わりに翻訳に参加する必要があります。 LeftJoinは翻訳されていなくても商品をお届けします。 – Rawburner

答えて

0

あなたのカラムがどのように正確に見えているのか分かりませんが、言語に "iso"というカラムが含まれていてテーブルがありますproduct_translationに "language_id"や "product_id"クエリは次のようになります。

$query = $this->createQueryBuilder('p') 
     ->select([ 
      'p', 
      'pt', 
      'lang', 
     ]) 
     ->join('language', 'lang', 'with', 'l.iso = :locale') 
     ->join('product_translations', 'pt', 'with', 'pt.language_id = l.id and p.id = pt.product_id') 
     ->where("p.status = 1") 
     ->SetParameter('locale', $locale) 
     ->add('orderBy','p.position ASC'); 

2つのカスタム結合を作成する必要があります。最初にisoカラムを使用して言語に結合し、次に変換テーブルを作成します。翻訳テーブルと商品テーブルをバインドする必要があります。ここでは言語と商品へのリンクが必要です。