2016-06-13 6 views
0

내 sonata-admin 설정에 Symfony2가있는 테이블이 두 개 있습니다 ('product''product_description'). 두 번째 제품은 여러 언어로 제품에 대한 설명을 보유하고 product_id 및 language_id 열을 복합 기본 키로 정의합니다. 제품 표에는 language_id 열이 없으므로 고객이 선택한 언어에 따라 설명과 동적으로 결합해야합니다.열과 정적 값에 JoinColumns가 있습니다.

나는 현재 그러나 방법 product_description (제품 테이블의 열로서 존재하지 않는) 정적 값으로 language_id와 결합 될 수있다하는 OneToOneJoinColumns 주석의 도움으로 그들과 합류하려고?

/** 
* ProductDescription 
* 
* @ORM\Table(name="product_description") 
* @ORM\Entity 
*/ 
class ProductDescription 
{ 

/** 
* @var integer 
* 
* @ORM\Column(name="product_id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="NONE") 
*/ 
private $productId; 

/* 
* @var boolean 
* 
* @ORM\Column(name="language_id", type="boolean") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="NONE") 
*/ 
private $languageId; 

.... 

} 



/** 
* Product 
* 
* @ORM\Table(name="product") 
* @ORM\Entity 
*/ 
class Product 
{ 

/** 
* @var integer 
* 
* @ORM\Column(name="product_id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="NONE") 
*/ 
private $productId; 

/** 
* @ORM\OneToOne(targetEntity="ProductDescription") 
* @ORM\JoinColumns({ 
*  @JoinColumn(name="product_id", referencedColumnName="product_id"), 
*  @JoinColumn(name="??????", referencedColumnName="language_id") 
* }) 
*/ 
private $productDescription; 

.... 

} 

편집 : 더 많은 코드 나는() 메소드는 그러나 목록보기에 이상한 결과를 얻을 수 createQuery에 queryBuilder 손으로 그것을 결합하려고했습니다

// admin class 
protected function configureListFields(ListMapper $listMapper) 
{  
    $listMapper->addIdentifier('productId', 'integer') 
     ->addIdentifier('productDescription.productName'); 
} 

protected function configureFormFields(FormMapper $formMapper) 
{ 
    $formMapper->add('offersId', 'integer', array('read_only' => true)) 
     ->add('productDescription.productName'); 
} 

을 추가했다.

public function createQuery($context = 'list') 
{ 
    $query = parent::createQuery($context); 

    $query->addSelect('p')->innerJoin('AppBundle\Entity\ProductDescription', 'p', 'WITH', $query->getRootAlias().'.productId = p.productId and p.languageId = 2'); 

    return $query; 
} 

편집 : 다음은 Hibernate에서의 유사한 질문입니다 - 아마도 doctrine으로 전송할 수 있습니까? 당신이 어떤 관련을 만들 수 있도록

https://forum.hibernate.org/viewtopic.php?f=1&t=986966

+0

우리에게 보여줄 수있는 코드가 있습니까? –

+0

코드가 추가되었습니다. product_id와 language_id의 고정 값에 대해이 두 테이블을 결합하는 방법을 말합니다. – Chris

답변

0

는 지금까지 내가 이해로, 아니 "언어", 모델에 존재합니다. 당신은 문자열이나 정수 열 유형을 작성하면됩니다 그냥 거기에 언어 값을 유지할 수있는 일 :

/** 
    * @ORM\Column(type="string") 
    * @var string 
    */ 
private $languageId 

당신은 세션 로케일을 사용하거나 유효한 ID의 몇 가지 검증과 모델의 일부 상수를 가질 수 있습니다

const LANGUAGE_ID_EN = 'en'; 
const LANGUAGE_ID_FR = 'fr'; 

public function setLanguageId($languageId) 
{ 
    if (! in_array($$languageId, [...]) { 
     throw new \Exception(...); 
    } 

    $this->languageId = $languageId; 
} 

그런 다음 당신은 추가 WHERE 절을 사용하여 쿼리를 만들 :

WHERE language_id = ? 

를 내가 바로 당신을 얻었기를 바랍니다. 귀하의 목표가 다른 것이라면 저희에게 알려주십시오.

+0

예, 올바르게 이해하고 있지만 자체 SQL 문을 선언 할 가능성이없는 sonata-admin을 사용하고 있습니다. 그래서 JoinColumns 주석이있는 솔루션 만 찾고 있습니다. – Chris

+0

join을 사용할 상황을 지정하십시오. 어떤 컨트롤러/방법/케이스에 정확히 그런 관계가 필요한가요? 그러면 해결책을 생각하는 것이 더 쉬울 것입니다. Sonata Admin은 많은 다른 번들 또는 "훌륭한 아키텍처"구성 요소로 사용자 정의 항목을 주입 할 수 있으므로 메소드가 다를 수 있으므로 정확하게 수행 할 위치를 이해해야합니다. 추신. Join은 모델 관계이므로 그러한 솔루션이 될 수는 없습니다. 의지의 불가능 성을 이해하기 위해 데이터베이스와 교리에 대해 더 많이 알아보십시오. ;) – lllypa

+0

나는 데이터베이스에 매우 익숙하지만 symfony와 doctrine은 나를 위해 아주 새로운 것이다;) 왜 나는 JoinColumn 주석에서 정적 값을 사용할 가능성이 없는지 이해할 수 없다. 두 데이터베이스 엔터티에 항상 기존 열을 제공해야하는 이유는 무엇입니까? 나의 유스 케이스의 경우 이것은 매우 편리하지 않다! 그리고 당신이 내 문제를 이해 한 것 같아,이 시나리오가 소나타 관리 환경에서 어떻게 처리 될지 예를 들어 주시겠습니까? 어떻게 해야할지 샘플을 필요로 할 것입니다. 컨트롤러/방법 등 모든 것에 적응할 필요가 없습니다. – Chris