2016-09-19 149 views
1

我有一个设置,我有产品供稿,每个供稿有许多产品。非常简单的设置是这样的:学说2:ManyToOne级联删除导致删除参考实体

饲料模型:

/** 
* 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; 
} 

现在你可以看到我已经级联启用,因为我希望所有的产品在Feed被删除时自动删除。

但是......此刻,当我删除产品时,它也会导致原始Feed te被删除。我怀疑它与这个关系是如何建立关系的,但我似乎无法弄清楚它出错的地方。

任何人都可以在这种情况下看到更多的光线吗?

+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; 
} 

现在,如果你删除一个Feed对象,链接到该饲料产品的对象也将被删除。

这是双向关系。

更多信息:

级联=在逆侧{“删除”}

  • 实体将被删除,而持有端(饲料)被删除,但只有当该实体(产品)不属于Feed以外的所有者。

orphanRemoval =“真”

  • 同上,但如果实体(产品)是由另一实体