2017-09-28 26 views
0

Doctrine/MySQLプロジェクトでは、ManyToManyの関係でリンクされた2つのエンティティがあります。Doctrine/MySQLでの "孤立した"孤児の除去

Clientエンティティ:

class Client 
{ 
    [...] 

    /** 
    * @ORM\ManyToMany(targetEntity="ClientTag") 
    * @ORM\JoinTable(name="clients_tags") 

    */ 
    protected $tags; 
} 

そしてClientTagエンティティ:

class ClientTag 
{ 
    [...] 

    /** 
    * @ORM\Column(type="string", length=45) 
    */ 
    protected $label; 

    /** 
    * @ORM\Column(type="string", length=7) 
    */ 
    protected $color; 
} 

だから私は1つのタグに複数のクライアントを関連付ける機能、およびその逆、偉大なを持っています。

しかし、私は自動的に方法を見つけることができませんそれを参照しているクライアントがなくなったときにタグを削除します

私はManyToMany注釈にorphanRemovalを使用しようとしましたが、それは私が.. 孤児除去は、私が上記正確に何を意味するものでなければならないが、その親への参照が削除されたとき、それはタグを削除し、ないと思った何をしません。私が必要とするような他のエンティティを考慮して。

クライアントがタグを削除したにもかかわらず、このタグがまだ2つの他のクライアントによって使用されている場合は、まだ参照するエンティティが1つ以上あるため、「orphan」とはみなされません。

もちろん、私は親を見つけることができない場合、クエリを実行してそれを削除することでケースを解決することができますが、DoctrineまたはMySQLにこれを行うための方法が組み込まれているのだろうか(もっと最適化されます)?

ありがとうございました。

+0

これがあなたの質問に答えるかどうか疑問です。 [双方向多対多カスケード削除と孤立削除操作](http://www.inanzzz.com/index。php/post/h0jt/bidirectional-many-to-many-cascade-remove-and-orphan-removal-operations-doctrine) – BentCoder

+0

私は恐れていません。彼は私の問題がどこにない接合部テーブルについて話しています。 **彼が例として持っているエンティティを使用して**、 私は 'tournament'を削除する方法を探しています。それは、「孤児の除去」が私に聞こえるようなものです。「この他のエンティティとの関係がなくなると、このエンティティを削除してください」。 – Stnaire

答えて

1

公式にorphanRemovalはdoctrineのManyToManyリレーションではサポートされていません。

http://docs.doctrine-project.org/en/latest/reference/annotations-reference.html#annref-manytomany

この場合の孤立除去は曖昧です。 削除されたエンティティの関係(結合可能なエントリ)を孤児または関連するエンティティとして理解することもできます。 データベースの観点からは、結合可能なエントリになります。 ORMの観点からは、関連するエンティティです。

ユースケースによってはどちらの方法も正しいです。たとえば、Article < - >Categoryの関係では、削除時に関連付けられたすべてのカテゴリから記事を削除したいと考えていますが、この時点では空であるためカテゴリ全体を削除することは望ましくありません。

DoctrineがManyToManyのためにDoctrineに正式にというオプションが記載されていないのは、その理由がわかっているからです。両方のバリエーションを完全にサポートするため、現在の実装では不十分です。

何とか分かりました。 あなたの場合は、おそらく未使用のタグを自分で整理する必要があります。

+0

あなたの答えをありがとうが、 'Client'エンティティの' $ tags'属性に "orphanRemoval"を追加することは私にはあいまいではありません。 あなたは 'Client'と' ClientTag'の関係にあり、 'Client'エンティティに関連付けられていない' ClientTag'を削除するようにシステムに指示します。 私は何かを見逃しているかもしれませんが、私が今理解していることから、それは実行可能なようです。 ジャンクション・テーブルは方程式の一部ではありません。エンティティの1つまたはジャンクション・テーブルで外部キーを使用するかどうかにかかわらず、リレーションを介して2つのエンティティ間に「リンク」があるかどうかを知る必要があります。 – Stnaire

+0

あなたは間違っていません。それは確かに実行可能ですが、教義はそれをしません。主なポイントは、OrphanRemovalはManyToMany(正式)でサポートされていないことで、説明した非公式のサポートは接続テーブル内の孤児をクリーンアップするだけです。他のすべては、私がなぜそれがおそらくサポートされていないのかというとちょうど私がひどく痛いものでした真の理由はおそらく、教義チームのメンバーだけが直接答えることができます。 – Joe

+0

お時間をありがとう。あなたは私の質問に答えました、私は何をする必要があるかを処理する方法はありません。 エンティティが孤立しているかどうかを確認するために選択カウントをしないようにしたいので悲しいですが、私は選択肢がないと思います。 私は質問を1オウ2日間開いたままにしておきます。 良い一日を。 – Stnaire