4

他のエンティティとの 3 つの関連付けを持つ教義を持つエンティティを作成しようとしています

したがって、アイテムは次のものに関連付けられます。

  • 発信元の 1 つの Rssfeed に関連付ける必要があります。
  • 1 つ以上の場所に関連付けることができます
  • 1 つ以上のタグに関連付けることができます

これが私の試みです:

class Item{

    /**
     * @ManyToOne(targetEntity="Rssfeed")
     */
    protected $rssfeed;

    /**
     *
     * @ManyToMany(targetEntity="Location")
     */
    protected $locations;

    /**
     *
     * @ManyToMany(targetEntity="Tag")
     */
    protected $tags;
}

  • Rssfeed が削除された場合は、関連するアイテムも削除する必要があります
  • アイテムが削除された場合、そのアイテムに添付されている RSS フィード、場所、およびタグを切り離す必要があります。
  • 場所またはタグが削除された場合、関連付けられたアイテムはオプションの関連付けであるため、単に切り離す必要があります。

それを達成するには、コードをどのように変更すればよいですか?

4

2 に答える 2

1

$rssfeed の場合は onDelete="CASCADE" で @JoinColumn を追加し、Location および Tag エンティティの外部キーの場合は onDelete="SET NULL" を追加する必要があります。

    /**
     * @ManyToOne(targetEntity="Rssfeed")
     * @JoinColumn(name="rssfeed_id", referencedColumnName="id", onDelete="CASCADE")
     */
    protected $rssfeed;
于 2012-06-25T06:07:10.520 に答える
1

Item エンティティの関連付けごとに、onDelete="SET NULL" を @JoinColumn アノテーションに追加します。場所とタグのエンティティ内で、JoinColumn 注釈を見つけて、"Item" との関連付けのために onDelete="SET NULL" を追加します。RssFeed エンティティの下で、各 @JoinColumn 注釈を見つけて、onDelete="SET NULL" を追加します。Doctrine カスケード操作を使用してこれを実現することもできることに注意してください (つまり、cascade={"remove"} など)。ただし、操作は RDBMS レベルで実行されないため、大幅に遅くなる可能性があります。

于 2012-06-25T23:26:18.267 に答える