4

私の目的は、エンティティに接続されたサウンドトラックのレコードが他にない場合にのみ、エンティティ アーティストのレコードを削除することです。

私はこの方法で orphanRemoval を試しました:

Soundtrack.php

/**
 * @Assert\NotBlank(message = "soundtrack.artists.blank")
 * @ORM\ManyToMany(targetEntity="Artist", inversedBy="soundtrack", cascade={"persist", "remove"}, orphanRemoval=true)
 * @ORM\JoinTable(name="soundtrack_artist")
 * @ORM\OrderBy({"name" = "ASC"})
 **/
private $artists;

アーティスト.php

/**
 * @ORM\ManyToMany(targetEntity="Soundtrack", mappedBy="artists")
 */
private $soundtrack;

しかし、エンティティ レコードのサウンドトラックを削除すると、他のレコードのサウンドトラックにリンクされている場合でも、エンティティ アーティストのレコードもクリアされます (これは orphanRemoval に期待すべきことだと思います)。

他のレコードが接続されていない場合にのみ、そのレコードを「孤立」として削除する方法はありますか?

私もこのように試しました:

**Soundtrack.php**

/**
 * @Assert\NotBlank(message = "soundtrack.artists.blank")
 * @ORM\ManyToMany(targetEntity="Artist", inversedBy="soundtrack", cascade={"persist"}, orphanRemoval=true)
 * @ORM\JoinTable(name="soundtrack_artist")
 * @ORM\OrderBy({"name" = "ASC"})
 **/
private $artists;

ただし、レコード エンティティ アーティストは削除しません。

4

1 に答える 1

1

orphanRemovalオプションは、所有側オブジェクトがその子を参照する唯一のインスタンスであると明示的に考えています。機能させるには、子を親から切り離して(参照を設定解除)、子を削除する必要があります。多対多の関連付けでは、エンティティを両側 (所有および反転) でデタッチする必要があります。

ドキュメントを見る

orphanRemoval=true オプションを使用する場合、Doctrine はエンティティが個人所有であり、他のエンティティによって再利用されないことを想定します。この前提を無視すると、孤立したエンティティを別のエンティティに割り当てたとしても、Doctrine によってエンティティが削除されます。

于 2015-02-20T09:20:27.327 に答える