2016-10-18 20 views
1

私の質問は、すべての関連付けを経ずに手動でエンティティを削除して手動で削除する方法です。この例ではSymfony Doctrineの関係 - 逆側のエンティティを削除する

<?php 

/** @Entity */ 
class User 
{ 
    // ... 
    /** 
    * @OneToMany(targetEntity="Address", mappedBy="user") 
    */ 
    private $addresses; 
    // ... 

    public function __construct() { 
     $this->addresses = new ArrayCollection(); 
    } 
} 

/** @Entity */ 
class Address 
{ 
    // ... 
    /** 
    * @ManyToOne(targetEntity="User", inversedBy="features") 
    * @JoinColumn(name="user_id", referencedColumnName="id") 
    */ 
    private $user; 
    // ... 
} 

Addressは所有側であるので、外部キーの検証が失敗するので、私はUserを削除することはできません。 Addressを削除してからUserを削除する必要があります。このような10の関係がある場合、削除プロセスは苦痛です。

私はManyToMany関係を作成することができますが、この方法はAddressエンティティがusersないuserを持っていますし、私はアドレスが一つだけのユーザーを持っていると思います。

これを行うにはどのような方法が最適ですか? @Max P.さんのコメントに追加するには

::私はので、私はここに私の2セントをあげるコメントするのに十分な評判がありません

+0

オプション 'ondelete = cascade'でDB外部キーを作ることができるので、DBはすべての子を自動的に削除します。 –

+0

どこにonDeleteを置くべきですか? ManyToOneの関係に? – nacholibre

+0

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-associations.html#transitive-persistence-cascade-operations –

答えて

0

@ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE") 

をあなたはより多くを見つけることができます詳細な回答はこちら:https://stackoverflow.com/a/6334710/4374331

これが役に立ちます。

+0

'onDelete =" CASCADE "'はDBですしたがって、Doctrineの作業単位に対してより複雑な操作を行う際に問題につながる可能性があります。 –

2

私はそれが役に立ちそうです。 逆側エンティティにカスケードを追加するだけです。

/** @Entity */ 
class User 
{ 
    // ... 
    /** 
    * @OneToMany(targetEntity="Address", mappedBy="user", cascade={"persist", "remove"}) 
    */ 
    private $addresses; 
    // ... 

    public function __construct() { 
     $this->addresses = new ArrayCollection(); 
    } 
    /* 
    * @return ArrayCollection 
    */ 
    public function getAddresses(){ 
     return $this->addresses: 
    } 

    /* 
    * @pram Address $address 
    */ 
    public function setAddresses (Address $address){ 
     $this->addresses->add ($address); 
    } 
} 
関連する問題