2014-07-07 5 views
46

Doctrine 연관에 대한 계단식 연산에 대한 내 이해를 확인하고 싶습니다. 이 질문의 목적을 위해 나는 CustomerInsuree의 두 모델을 가지고 있습니다.Doctrine Cascade Operations 이해하기

  • 이 insuree을 지속하고의 연결을 만들 것입니다 고객에게 새로운 insuree 추가 : 나는 CustomerInsuree 및 설정 cascade{"all"} 사이에 많은 관계에 대한 많은 정의하면

    는,이 뜻을 이해 조인 테이블.

  • 컬렉션에서 insuree를 제거하면 고객으로부터 insuree가 분리되어 insuree에서 고객이 분리됩니다.
  • 고객을 삭제하면 고객과 관련된 모든 보험이 삭제됩니다.

이 정의는 Customers에 있습니다. insuree에 새로운 고객을 추가

  • 이 고객을 계속 만들 것입니다 : 내가 InsureeCustomer 및 설정 cascade{"all"} 사이의 많은 관계로 많은 역을 정의하면

    /** 
    * @ORM\ManyToMany(targetEntity="Insuree", inversedBy="customers", cascade={"all"}) 
    * @ORM\JoinTable(name="customer_insuree", 
    *  joinColumns={@ORM\JoinColumn(name="customer_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="insuree_id", referencedColumnName="id")} 
    *) 
    */ 
    protected $insurees; 
    

    는,이 뜻을 이해 조인 테이블의 연관

  • 고객을 컬렉션에서 제거하면 고객이 보험에서 분리되어 보험금을 고객과 분리 할 수 ​​있습니다.
  • insuree를 삭제하면 관련된 모든 고객이 삭제됩니다.

이것은 Insurees에있는 연결의 정의입니다.

/** 
* @ORM\ManyToMany(targetEntity="Customer", mappedBy="insurees", cascade={"all"}) 
*/ 
protected $customers; 

그때 병합 및 분리에 계단식으로 유지하는 등의 관계를 정의하는 경우 - insuree가 연관된 모든 고객은 삭제되지 않습니다 삭제 - 그것은 단지 insuree와 고객 사이의 연결을 제거하는 것?

/** 
* @ORM\ManyToMany(targetEntity="Customer", mappedBy="insurees", cascade={"persist", "merge", "detach"}) 
*/ 
protected $customers; 
+1

'고객'과 'Insure'를 만들고 레코드 삭제/추가를 시작하여 계단식 관계에 대한 이해가 올바른지 확인할 수 없습니까? – undefined

답변

103

는 & 당신은 약 cascade={"persist"} 지속 엔티티 A, 교리는 또한 컬렉션의 모든 B 엔티티를 지속 것을 의미 올바른지

제거 지속.

또한 cascade={"remove"}에 대한 올바른 내용으로, 엔티티 A를 제거하면 Doctrine도 컬렉션의 모든 B 엔티티를 제거합니다.
그러나이 작업을 모든 B 엔터티로 케스케이드하는 엔터티 A를 제거하면 해당 B 엔터티가 다른 A 엔터티에 연결될 수 있으므로 ManyToMany 연결에서이 메서드를 사용하려고 할 것입니다.(코드에서) 당신이 필요 할 뭔가

이 컬렉션에서 개체를 제거/추가입니다 :

하지cascade={"detach"}cascade={"merge"} 올바른 당신은 있습니다 & 병합

분리합니다. 해당 내용은 here입니다.

Detach은 EntityManager에서 엔티티를 분리한다는 것을 의미합니다. EntityManager는 더 이상 해당 엔티티를 관리하지 않습니다. 이것은 분리 된 엔티티가 이미 인스턴스화 된 엔티티와 동일하게 만듭니다. 단, 엔티티 매니저가 이미 데이터베이스에 있다는 것을 제외하고는 (그러나 EntityManager가이를 인식하지 못하게 만들었습니다).

다른 말로하면 : cascade={"detach"}은 엔티티 A를 분리한다는 의미이며, Doctrine은 콜렉션의 모든 B 엔티티도 분리합니다.

병합의 반대가를 분리입니다 : 당신은 다시의 EntityManager로 분리 된 개체를 병합합니다.
merge()은 실제로 관리 개체를 반환하며, 전달 된 분리 개체는 관리되지 않는 상태로 유지됩니다.