2017-12-15 21 views
0

Im Symfony와 Doctrine에 새로운 기능이있어서 새로운 문제를 해결할 수 없습니다.Symfony/Doctrine : 여러 테이블 선택

transactional이라는 데이터베이스 테이블과 customer이라는 데이터베이스 테이블이 있습니다. transactional 테이블에는 customer 테이블에 대한 외래 키가 있습니다. 이제 두 테이블에서 모든 데이터를 가져 오려고합니다. 그러나 Customer 필드는 모두 null로 설정됩니다.

/** 
* @var \AppBundle\Entity\Customer 
* 
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Customer") 
* @ORM\JoinColumns({ 
* @ORM\JoinColumn(name="fk_customer", referencedColumnName="id") 
* }) 
*/ 
private $fkCustomer; 

교리 검색어 :

transactional : 여기

transactional PHP는 객체의 외래 키

$em = $this->getDoctrine()->getManager(); 
$transactions = $em->getRepository('AppBundle:Transactional')->findAll(); 
dump($transactions); 

결과 :

0 => Transactional {#483 ▼ 
-id: 1 
-date: DateTime @1510873200 {#493 ▶} 
-fkCustomer: Customer {#566 ▼ 
    +__isInitialized__: false 
    -id: 1 
    -gender: null 
    -firstname: null 

시간 내 주셔서 대단히 감사합니다. =)

답변

1

교리 지연로드입니다.

거래 개체의 고객 속성에 액세스하면 관련 정보가로드됩니다.

그러나 모든 고객 개체가 단일 쿼리를 통해로드되므로 많은 트랜잭션 항목을 반복하는 경우 이상적이지 않습니다.

당신은 같은 EAGER에의 fetchMode을 설정하여 해결할 수 있습니다 : 프록시 개체를 사용하는 대신 완전히 고객 데이터를 채워야

/** 
* @var \AppBundle\Entity\Customer 
* 
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Customer", fetch="EAGER") 
* @ORM\JoinColumns({ 
* @ORM\JoinColumn(name="fk_customer", referencedColumnName="id") 
* }) 
*/ 
private $fkCustomer; 

합니다.

또 다른 방법은 명시 적으로 고객 데이터를 조인하는 사용자 지정 리포지토리 메서드를 통해 트랜잭션 항목을로드하는 것입니다. 이 같은 funciton Transactional에 대한 사용자 정의 저장소를 생성하고 추가로 예를 들어 :

public function load() 
{ 
    $qb = $this->_em->createQueryBuilder(); 
    $qb->select('t, c') 
     ->from('AppBundle:Transactional','t') 
     ->join('t.fkCustomer', 'c'); 

    return $qb->getQuery()->execute(); 
} 

방법 사용자 정의 저장소를 만들 수는 문서에서 찾을 수 있습니다 https://symfony.com/doc/3.3/doctrine/repository.html

+0

지금까지 첫 번째 옵션을 사용해 보았지만 제대로 작동하지 않았습니다. 그러나 나는 두 번째 글을 읽었습니다. – Dario

+0

안녕하세요, 아직 두 번째 해결 방법을 시도하지는 않았지만 무언가를 발견했습니다. Symfony 디버깅 도구에서 다음 쿼리를 발견했습니다 :'SELECT t0.id AS id_1, t0.date AS date_2, t0.fk_customer AS fk_customer_3 FROM transactional t0'. join 문이 없어야합니까? 또는 join 문이 쓰루 트로 드린으로 처리 되었습니까? – Dario

+0

findAll과 같은 기본 리포지토리 기능을 사용하는 경우 doctrine은이 클래스의 테이블 만 쿼리합니다.EAGER를 가져 오면 그 (것)들을 결합해야합니다. 그러나 EAGER가 거의 아무것도하지 않는 경우도 있습니다. 내가 사용해야하는 쿼리를 정의 할 수 있고 수동 조인을 통해 실제로 많은 수의 단일 db 쿼리를 얻을 수 있기 때문에 항상 이러한 경우에 사용자 지정 리포지토리를 사용합니다. – Joe

1

당신은 열망에 유형을 가져 설정해야 :

전자 형식 : 관련 엔터티도로드하십시오.

게으른 유형 : 필요한 엔티티를로드하십시오.

/** 
* @var \AppBundle\Entity\Customer 
* 
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Customer",fetch="EAGER") 
* @ORM\JoinColumns({ 
* @ORM\JoinColumn(name="fk_customer", referencedColumnName="id") 
* }) 
*/ 
private $fkCustomer;