ドクトリン・カスケード・オペレーションを理解する
質問
Doctrine のアソシエーションに対するカスケード操作について理解度を確認したいです。この質問のために、私は2つのモデルを持っています。
Customer
と
Insuree
.
を多対多の関係で定義した場合。
Customer
と
Insuree
と設定し
cascade{"all"}
になることは理解しています。
- 顧客に新しい保険加入者を追加すると、この保険加入者が永続化され、結合テーブルに関連付けが作成されます。
- コレクションからインシュレーを削除すると、インシュレーが顧客から切り離され、顧客がインシュレーから切り離されます。
- 顧客を削除すると、その顧客に関連するすべての被保険者が削除されます。
の関連付けの定義です。
Customers
.
/**
* @ORM\ManyToMany(targetEntity="Insuree", inversedBy="customers", cascade={"all"})
* @ORM\JoinTable(name="customer_insuree",
* joinColumns={@ORM\JoinColumn(name="customer_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="insuree_id", referencedColumnName="id")}
* )
*/
protected $insurees;
の間に逆多対多の関係を定義すると、その関係から
Insuree
と
Customer
と設定し
cascade{"all"}
になることは理解しています。
- insuree に新しい顧客を追加すると、この顧客が永続化され、結合テーブルに関連付けが作成されます。
- コレクションから顧客を削除すると、その顧客がインシュレーから切り離され、インシュレーが顧客から切り離されます。
- insureeを削除すると、それに関連するすべてのカスタマーが削除されます。
の関連付けの定義です。
Insurees
.
/**
* @ORM\ManyToMany(targetEntity="Customer", mappedBy="insurees", cascade={"all"})
*/
protected $customers;
保険加入者を削除しても、関連する顧客はすべて削除されず、保険加入者とその顧客との関連付けが削除されるだけですか?
/**
* @ORM\ManyToMany(targetEntity="Customer", mappedBy="insurees", cascade={"persist", "merge", "detach"})
*/
protected $customers;
どのように解決するのですか?
削除する
については正しいです。
cascade={"persist"}
は、エンティティ A を永続化すると、Doctrine はコレクション内のすべての B のエンティティも永続化することを意味します。
についても正しいです。
cascade={"remove"}
は、エンティティ A を削除すると、Doctrine はコレクション内のすべての B のエンティティも削除することを意味します。
なぜなら、エンティティ A を削除すると、B のエンティティにもこの操作が及ぶため、B のエンティティは他の A のエンティティに関連している可能性があるからです。
デタッチ & マージ
あなたは
ではない
について正しく
cascade={"detach"}
と
cascade={"merge"}
:
コレクションへのエンティティの追加・削除は、何かというと あなた を行う必要があります (あなたのコードで)。それについて読む はこちら .
切り離し は、エンティティをEntityManagerから切り離すことを意味します。EntityManager はもはやそのエンティティを管理しません。これにより、デタッチされたエンティティは、それがすでにデータベースにある(しかしEntityManagerにそれを意識させないようにした)ことを除けば、新しくインスタンス化されたエンティティと同じになります。
言い換えれば
cascade={"detach"}
は、エンティティ A をデタッチすると、Doctrine はコレクション内のすべての B のエンティティもデタッチすることを意味します。
マージ
の逆で
デタッチ
: デタッチされたエンティティをEntityManagerにマージして戻すことになります。
注意点としては
merge()
は実際には
新しい
を返しますが、渡されたデタッチドオブジェクトはアンマネージドなままです。
関連
-
[解決済み】XAMPPポート80をPID 4の「Unable to open process」が使用中 [重複] XAMPPポート80をPID 4の「Unable to open process」が使用中。]
-
[解決済み] SAJAXは死んだか?何を置き換えるべきか?
-
[解決済み】未定義のメソッド mysqli_stmt::get_result を呼び出す。
-
[解決済み】Laravel 5.2 Storage::makeDirectory($dir) でディレクトリが作成されない。
-
[解決済み】未定義の関数mysql_query()をLoginで呼び出す【重複
-
[解決済み】PHPの予期しないT_VARIABLEとは何ですか?
-
[解決済み】phpMyAdmin: シークレットパスフレーズ?
-
MacでPHPを実行した際に、メモリサイズが134217728バイトも消費される問題の解決方法について
-
[解決済み] Forbidden :このサーバーの /phpmyadmin にアクセスする権限がありません。
-
[解決済み] SQL ON DELETE CASCADE、削除はどちらで行われますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Fatal error: 未定義の関数 sqlsrv_connect() を呼び出した。
-
[解決済み] 整形されていない数値が発生しました。
-
[解決済み】メンバ関数をnullで呼び出す?
-
[解決済み】Xampp ローカルホスト/ダッシュボード
-
[解決済み】Laravel 5.2 Storage::makeDirectory($dir) でディレクトリが作成されない。
-
[解決済み】既に開始されているPHPセッション【重複あり
-
[解決済み】phpMyAdmin: シークレットパスフレーズ?
-
[解決済み】SSLピア証明書またはSSHリモートキーがOKでなかった
-
[解決済み] mysqli_fetch_assoc() は、パラメータ 1 が mysqli_result であることを期待し、boolean が与えられる [重複] 。
-
[解決済み】MySQLのカラム数が1行目の値数と一致しない【非公開