2016-12-12 1 views
0

설명, 이름 등이 다른 언어로 저장된 제품을 다른 테이블에 저장했습니다. 하나의 제품은 여러 번역 (제품 데이터)을 가질 수 있습니다. 많은 언어가있는 경우Symofny2 Query 빌더 leftJoin with many relationships

는 현재 전 제품의 모든 번역을 얻을 로케일에 따라 필요한 번역을 얻을 수있는 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'); 

두 개의 사용자 지정 조인을 만들어야합니다. 먼저 iso 열을 사용하여 언어에 가입시킨 다음 변환 테이블을 작성하십시오. 번역 테이블과 제품 테이블을 바인딩해야합니다. 여기서 언어 및 제품에 대한 링크가 필요합니다.