2

私には2つのエンティティがあります:aPersonAddress

  • を持つPersonことができますAddress
  • Addressから自給自足で生きることができますPerson

私はこのような関係を作成しました:

住所

/**
 * @ORM\OneToMany(targetEntity="Person", mappedBy="address", cascade={"detach"})
 */
protected $persons;

/**
 * @ORM\ManyToOne(targetEntity="Address", inversedBy="persons", cascade={"detach"})
 * @ORM\JoinColumn(name="address_id", referencedColumnName="id")
 */
protected $address;

Addressこれに関連するを削除しようとするとPerson、もちろん、「整合性制約違反」が発生します。を単純に切り離すようにドクトリンに指示するにはどうすればよいですAddressPerson。両方で使用しようとしcascade={"detach"}たが何も起こらない場合。

4

3 に答える 3

5

人:

/**
* @ORM\ManyToOne(targetEntity="Address", inversedBy="persons")
* @ORM\JoinColumn(name="address_id", referencedColumnName="id", onDelete="SET NULL")
*/
protected $address;

住所:

/**
* @ORM\OneToMany(targetEntity="Person", mappedBy="address", cascade={"all"})
*/
protected $persons;

この設定は私にとって完璧に機能します。addressを削除すると、address_idでpersonがNULLになります。次のようなことを行うと、すべてのアドレスにカスケード接続すると、新しい人も節約できます。

$address->setPersons(
    array( $person1, $person2 )
) ;

$ personは次のようになります:

$person1 = new Person() ;
$person1->setName(....) ;

これが機能しない場合は、コントローラーまたは単体テストからコードを送信してください。これは最も基本的なコードである必要があります。アドレスを操作する場合は、アドレスエンティティを永続化するだけです。個人エンティティについても同じです。あなたは両方を持続させる必要はありません、教義はそれを世話します。

于 2012-11-15T16:01:32.773 に答える
1

jperovicソリューションは機能しています-私はそれをテストしませんでしたが、それは私には良い音です。
私があなたに提案できることは、コードの量と起こりそうなエラーを減らすために、この通りの1つに従うことです:

  1. ORMBASED-続きを読む
  2. RDBMSBASED-ON DELETE SET NULLテーブルの外部キーに直接使用します。

    CONSTRAINT fk_18ffff524ebd63f2 FOREIGN KEY (canale_id)
      REFERENCES canale (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE CASCADE
    

(postgresqlから)

于 2012-11-15T13:39:47.007 に答える
1

次のように削除できます。

$id = ...; #some id
$personRepository = $this->getDoctrine()->getRepository('AcmeDemoBundle:Person'); #entity repository
$em = $this->getDoctine()->getEntityManager();

$person = $personRepository->find($id);
$address = $person->getAddress();
$person->setAddress(NULL); 
$em->remove($address);
$em->flush();

に関するいくつかのサイドノート $person->setAddress(NULL)

  • CASCADE外部キーに制約がある場合は、これを呼び出す必要があります。そうしないと、レコードも失われます。 Person
  • 制約をSET NULL行に変更した場合$person->setAddress(NULL)、値が自動的に設定されるため、必要ありませんNULL

お役に立てれば....

于 2012-11-15T12:16:21.493 に答える