cascade = {“remove”} VS orphanRemoval = true VS ondelete = "CASCADE


93

부모 엔티티가 삭제되면 자동으로 자식 엔티티를 삭제하는 방법에 대한 정보를 거의 수집하지 않았습니다. 가장 일반적인 방법은 cascade = { "remove"} OR orphanRemoval = true OR ondelete = "CASCADE" 세 가지 주석 중 하나를 사용하는 것 같습니다 .

나는 : 세 번째에 대한 약간의 혼동 ondelete = "CASCADE" 이 일이 매우 부족한 대해 교리 공식 문서에서 설명으로) 누군가 할 수 있다면 나는 사랑을 나에게 다음과 같은 정보 확인 I 수집을하고 내 연구에서 이해 그물과 경험 ...

그것이하는 일

cascade = { "remove"}
==> 소유 측 엔티티가 있으면 반대 측 엔티티가 삭제됩니다. 당신이 다른 소유 측 엔티티와 많은 토 머니에 있더라도.
-컬렉션에 사용되어야 함 (OneToMany 또는 ManyToMany 관계에서)-ORM
에서 구현

orphanRemoval = true
==> 소유 측 엔티티가이고 다른 소유 측 엔티티에 더 이상 연결되지 않은 경우 반대 측의 엔티티가 삭제됩니다. (참조 doctrine official_doc -ORM에서 구현
-OneToOne, OnetoMany 또는 ManyToMany와 함께 사용할 수 있음)

onDelete = "CASCADE"
==> 이것은 데이터베이스의 외래 키 열에 On Delete Cascade를 추가합니다
.-이 전략은 약간 까다 롭지 만 매우 강력하고 빠를 수 있습니다. (참조 doctrine official_doc ... 그러나 더 많은 설명을 읽지 않음)
-ORM은 이전의 두 가지 방법에 비해 작업이 적으므로 성능이 향상되어야합니다.

기타 정보
-이 세 가지 방법은 모두 양방향 관계 엔티티에서 구현됩니다 ( right ??? )
-cascade = { "remove"}를 사용하면 모든 외래 키 onDelete = CASCADE를 완전히 우회합니다. (참조 doctrine_official_doc )

코드에서 사용하는 방법에 대한 예

  • orphanRemoval 및 cascade = { "remove"}는 반전 된 엔티티 클래스에 정의됩니다.
  • ondelete = "CASCADE"는 소유자 엔티티에 정의됩니다.
  • @ORM \ JoinColumn (onDelete = "CASCADE")를 작성하고 doctrine이 열 이름을 처리하도록 할 수도 있습니다.

cascade = { "제거"}

/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", cascade={"remove"})
*/
protected $Phonenumbers

orphanRemoval = true

/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", orphanRemoval=true)
*/
protected $Phonenumbers

onDelete = "CASCADE"

/** 
* @ManyToOne(targetEntity="Contact", inversedBy="phonenumbers")
* @JoinColumn(name="contact_id", referencedColumnName="contact_id", onDelete="CASCADE")
*/ 
protected $contact; 

1
그것은 좋은 설명을 가지고 stackoverflow.com/questions/25515007/...
Gregsparrow

답변:


61

onDelete="CASCADE"데이터베이스 자체에서 관리합니다. cascade={"remove"}교리에 의해 관리됩니다.

onDelete="CASCADE"작업이 교리에 의해 대신 데이터베이스 수준에서 수행되기 때문에 더 빠릅니다. 제거는 Doctrine이 아닌 데이터베이스 서버에 의해 수행됩니다. With cascade={"remove"}doctrine은 엔티티 자체를 관리해야하며 다른 소유 엔티티가 없는지 확인하기 위해 추가 검사를 수행합니다. 다른 것이 없으면 엔티티를 삭제합니다. 그러나 이것은 오버 헤드를 발생시킵니다.


cascade = { "제거"}

  • 역측의 엔티티는 소유 측 엔티티가있을 때 삭제됩니다. 당신이 다른 소유 측 엔티티와 많은 토 머니에 있더라도. 아니요, 법인이 다른 소유의 경우입니다. 삭제되지 않습니다.
  • 컬렉션에 사용해야합니다 (따라서 OneToMany 또는 ManyToMany 관계).
  • ORM에서 구현

orphanRemoval = "true"

  • 역측의 엔티티는 소유 측 엔티티가이고 다른 소유 측 엔티티에 더 이상 연결되지 않은 경우 삭제됩니다. 정확히는 아니지만 이것은 교리가 다른 실체가 소유하지 않은 것처럼 행동하게하여 제거합니다.
  • ORM에서 구현
  • OneToOne, OnetoMany 또는 ManyToMany와 함께 사용할 수 있습니다.

onDelete = "CASCADE"

  • 이것은 데이터베이스의 외래 키 열에 On Delete Cascade를 추가합니다.
  • 이 전략은 제대로 작동하기에는 약간 까다 롭지 만 매우 강력하고 빠를 수 있습니다. (이것은 교리 공식 튜토리얼의 인용문입니다 ...하지만 더 많은 설명은 보지 못했습니다)
  • ORM은 이전의 두 가지 작업 방식에 비해 더 적은 작업을 수행해야하므로 성능이 향상되어야합니다.

3
@ waaghals. cascade = { "remove"} ==> 엔티티 Article과 Category 사이에 ManyToMany 관계가 있습니다. 기사를 제거하면 ($ em-> remove ($ article);)이 기사에 링크 된 모든 범주가 ​​제거됩니다. 해당 범주가 다른 기사에도 링크되어있는 경우에도 마찬가지입니다. 그래서 나는 당신이 쓰는대로 작동하지 않는다고 말할 것입니다.
Alexis_D 2014

2
@ waaghals. orphanRemoval = "true"에 대한 귀하의 의견에 대해 내가 쓴 "반대측 엔티티는 소유 측 엔티티가 삭제되고 다른 엔티티가 소유하지 않습니다"라는 문장이 교리 공식 페이지에서 인용되었습니다. doctrine = orphanremoval .
Alexis_D 2014

1
@Alexis_D, 완전히 대답은 잘못 정말 초보자를위한 혼란 스러울 수 있습니다 귀하의 의견에 동의
스테판 Yudin

3
내가 읽은 명확한 예 중 하나 : gist.github.com/pylebecq/f844d1f6860241d8b025
Victor S

@VictorS의 링크는 매우 명확합니다. 나는 더 이상 교리와 함께 일하지 않기 때문에 그것이 어떻게 작동하는지 직접 알지 못하면 내 대답을 업데이트 할 수 없다고 생각합니다. 누군가 내 대답을 업데이트 할 수 있다면 좋을 것입니다.
Waaghals
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.