2016-09-19 8 views
1

제가 제품 피드를 가지고 있고 각 피드에 많은 제품이 있습니다. 매우 간단한 설정과 같은 :Doctrine 2 : ManyToOne cascade remove는 참조 된 엔티티가 삭제되도록합니다.

공급 모델 :

/** 
* Class Feed represents a single feed as supplier by a supplier 
* @package App\Model 
* @Entity @Table(name="feeds") 
*/ 
class Feed 
{ 
    /** 
    * @var int 
    * @Id @Column(type="integer") @GeneratedValue 
    */ 
    protected $id; 
} 

제품 모델 : 나는 모든 제품을 원하기 때문에 당신이, 내가 사용할 수 계단식 한 볼 수 있듯이 이제

/** 
* Class Product is the base for either supplied and current products 
* @package App\Model 
*/ 
class Product 
{ 
    /** 
    * @var int 
    * @Id @Column(type="integer") @GeneratedValue 
    */ 
    protected $id; 

    /** 
    * @var Feed 
    * @ManyToOne(targetEntity="App\Model\Feed", cascade={"remove"}) 
    * @JoinColumn(name="id_feed", referencedColumnName="id", onDelete="CASCADE") 
    */ 
    protected $feed; 
} 

피드가 삭제되면 자동으로 삭제됩니다.

그러나 ... 제품을 삭제하면 현재 피드도 삭제됩니다. 나는 그 관계가 어떻게 설정되어 있는지와 관련이 있다고 생각하지만, 그것이 틀린 부분을 파악할 수는 없다.

누구든지이 상황에 대해 더 많은 것을 보여줄 수 있습니까?

+0

소유 한 경우 ORM은 무시 귀하의 제품에 매핑 된 "OneToMany". 사실, 단방향 관계를 정의했습니다. 당신은 양방향 관계를 정의해야합니다 – Delphine

+0

설명 주셔서 감사합니다! 종류의 새로운 교리. 저는 CASCADE가 MySQL에서 어떻게 작동하는지 생각하고있었습니다. 여러분이 고아에서 정의하는 것만으로 Doctrine에서 비슷한 접근 방식을 취할 수 있다고 생각했습니다. –

+0

Orm은 나를위한 퍼즐이기도합니다! 그러나 일단 잘 설정되면 그것은 마술과 같습니다. 이 게시물에서 자세한 내용을 확인할 수 있습니다 : http://stackoverflow.com/questions/25515007/doctrine-cascade-remove-vs-orphanremoval-true?rq=1. – Delphine

답변

1

피드 모델 :

/** 
    * Class Feed represents a single feed as supplier by a supplier 
    * @package App\Model 
    * @Entity @Table(name="feeds") 
    */ 
    class Feed 
    { 
     /** 
     * @var int 
     * @Id @Column(type="integer") @GeneratedValue 
     */ 
     protected $id; 

     /** 
     * @var Feed 
     * @OneToMany(targetEntity="App\Model\Product", mappedBy="feed", orphanRemoval=true, cascade={"remove"}) 
     * 
     */ 
     protected $products;  

    } 

제품 모델 : 당신이 피드 객체를 삭제하면

/** 
* Class Product is the base for either supplied and current products 
* @package App\Model 
*/ 
class Product 
{ 
    /** 
    * @var int 
    * @Id @Column(type="integer") @GeneratedValue 
    */ 
    protected $id; 

    /** 
    * @var Feed 
    * @ManyToOne(targetEntity="App\Model\Feed", inversedBy="products") 
    * @JoinColumn(name="id_feed", referencedColumnName="id") 
    */ 
    protected $feed; 
} 

이제이 피드에 연결된 제품의 객체도 삭제됩니다.

이것은 양방향 관계입니다.

상세 정보 :

캐스케이드 = 역 측에

  • 엔티티를 { "제거"는}하지만 기업이 경우 소유 측 (피드)이 삭제되는 동안 삭제됩니다 (제품)은 피드가 아닌 다른 소유가 아닙니다.

orphanRemoval = "true"를 상기와

  • 동일하지만, 엔티티 (제품이) 당신이 피드 클래스에서이 폭포를 정의해야한다고 생각 다른 엔티티