2016-10-19 5 views
1

1 대 1의 관계가 있습니다. 나는지도 (각 블록은 별도의지도)와 객실 (각지도에는 여러 개의 방이 있음)이 있습니다. 그래서 실체에 대해 내가 가지고있는 (내가 정보를 잘라 필요하지 않습니다) :Symfony/Doctrine에 일대일 레코드가 존재하지 않는지 확인하십시오.

/** 
* Block 
* 
* @ORM\Table(name="BLOCK") 
* @ORM\Entity 
*/ 
class Block 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="PK", type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="SEQUENCE") 
    * @ORM\SequenceGenerator(sequenceName="SEQ_GET_BLOCK_PK", allocationSize=1, initialValue=1) 
    * @ORM\OneToMany(targetEntity="Rooms", mappedBy="blockId") 
    */ 
    private $pk; 
} 

/** 
* Rooms 
* 
* @ORM\Table(name="ROOMS", indexes={@ORM\Index(name="IDX_EB2CE87E9B70DE02", columns={"MAP_ID"})}) 
* @ORM\Entity 
*/ 
class Rooms 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="PK", type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="SEQUENCE") 
    * @ORM\SequenceGenerator(sequenceName="SEQ_GET_ROOMS_PK", allocationSize=1, initialValue=1) 
    */ 
    private $pk; 

    /** 
    * @var \Block 
    * 
    * @ORM\ManyToOne(targetEntity="Block") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="BLOCK_ID", referencedColumnName="PK") 
    * }) 
    */ 
    private $block; 

지금 방에 속하는 어떤 블록을 얻기 위해, 그 컨트롤러에, 간단합니다

$roomRepo = $this->getDoctrine()->getRepository('AppBundle:Rooms'); 
$rooms = $roomRepo->findAll(); 

와 나뭇 가지에 (필드 이름은 상기 블록 테이블의 다른 필드 임) :

그러나
{% for room in rooms %} 
    {{ room.block.fieldname }} 
{% endfor %} 

는 블록의리스트를 표시하고이 어려워진다 하에서 실을 나타낸다. 내가 좋아하는 나뭇 가지에 블록의 목록을 얻을 뭔가를 할 수 있도록하고 싶습니다 :이 상황에서

{% for block in blocks %} 
    {% for room in block.rooms %} 
     {{ room.name }} 
    {% endfor %} 
{% endfor %} 

, 나는 그들 아래에 방이없는 블록의 목록을 얻기 위해 노력하고 있어요. 위의 해결 방법이 효과적이라면 각 블록에서 방의 개수를 계산하고 아무 것도없는 경우에만 표시 할 수 있습니다. 또 다른 옵션은 createQueryBuilder에서 쿼리를 수행하고 올바른 결과를 가진 엔티티 블록을 반환하는 것입니다.

아이디어가 있으십니까? 나는이 길을 내려다 보지 만 조금 후에 벽에 부딪쳤다. http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#one-to-many-bidirectionalBlock 기본 키의 $pk 속성이

인가 : 당신이 일대 양방향 관계를 필요로 같은

답변

2

보인다? 그런 다음 주석 @ORM\OneToMany을 가질 수 없습니다 당신은 객실의 컬렉션 별도의 재산이 있어야합니다 같은

/** 
* @ManyToOne(targetEntity="Block", inversedBy="rooms") 
* @JoinColumn(name="BLOCK_ID", referencedColumnName="PK") 
*/ 
private $block; 

사용 사례가 정확히 같은 보인다

/** @OneToMany(targetEntity="Rooms", mappedBy="block") */ 
private $rooms; 

다음 Room 클래스를 설명서에있는 내용이므로 예제를 따르는 것이 좋습니다.

+0

나는 정답이므로이 해결책을 추가하지 않으려 고한다. (이 경우 여분의 필드를 추가하고 싶지는 않으며 업데이트 된 방법으로 유지하기가 쉽지 않다. 앞으로는 1 대 1로 갈 길이 멀다.이 경우 나는 이것을 처리하기 위해 좀 더 복잡한 SQL을 수동 조인과 함께 구현했다. – MicWit

0

마틴 게시 된 솔루션을 사용할 수있는 경우,하지만, 내 경우에는 내가 원하는 결과를 얻기 위해보다 복잡한 쿼리를 추가하기로 결정했습니다. 쿼리는 다음과 같이 보입니다.

$blockRepo = $this->getDoctrine()->getRepository('AppBundle:Blocks'); 
$query = $blockRepo->createQueryBuilder('b') 
    ->select('b') 
    ->leftJoin("AppBundle:Rooms", "r", "WITH", "b.pk=r.block") 
    ->where("b.location = :locationId") 
    ->andWhere("r.pk IS NULL") 
    ->setParameter("locationId", $locationId) 
    ->getQuery(); 
$blocks = $query->getResult(); 

실제로 리포지토리의 사용자 지정 함수에서이 작업을 수행했지만이 코드가 작동합니다. 마찬가지로 2 개의 라인 (where와 setParameter)을 locationId와 함께 사용하면, 다른 필드에서도 선택하기를 원했기 때문에,이 두 라인을 생략하면 룸이없는 모든 블록을 선택하게됩니다.