0

たとえば、User、Item、Image などのエンティティがあります。ユーザーは多くのアイテムを持っています。商品画像が多いです。

cascade={'remove'} または onDelete=Cascade のどちらの削除オプションを選択すればよいですか?

また、Image にはライフサイクル コールバックがあります。上記のカスケードオプションの違いを知っています。User オブジェクトを削除するときに onDelete=cascade オプションを使用した場合、PostRemove() のようなライフサイクル コールバックが呼び出されるのではないかと考えていました。

ここに私のエンティティがあります:

//User.php
class User {
   /**
    * @ORM\OneToMany(targetEntity="Item", mappedBy="user", onDelete="CASCADE")
    */
    private $items;
}

//Item.php
class Item {
   /**
   * @var User
   *
   * @ORM\ManyToOne(targetEntity="User", inversedBy="items")
   * @ORM\JoinColumns({
   *   @ORM\JoinColumn(name="user_id", referencedColumnName="id")
   * })
   */
   private $user;
   /**
    * @ORM\OneToMany(targetEntity="ItemImage", mappedBy="item",onDelete="CASCADE")
    */
   protected $images;

}

//ItemImage.php
class ItemImage {
   /* Setters and getter **/
   /**
   * @var Items
   *
   * @ORM\ManyToOne(targetEntity="Item", inversedBy="images")
   * @ORM\JoinColumns({
   *   @ORM\JoinColumn(name="item_id", referencedColumnName="id")
   * })
   */
   private $item;
   /**
   * @ORM\PostRemove()
   */
    public function removeUpload() {
       unlink($this->getUploadDir() . '/' . $this->imageName);
    }
 }

私の質問は、ユーザーが削除されると、ユーザーに関連付けられたすべてのアイテムとアイテムに関連する画像が削除されることですか? また、ユーザーが削除されたときに Image エンティティの PostRemove() コールバックを呼び出す必要がありますか? このような場合、onDelete="cascade" または cascade={'remove'} のどちらのオプションを使用すればよいですか?

4

1 に答える 1

0

onDelete='CASCADE'は SQL レベルを追加しますON DELETE CASCADE。はい、画像はテーブルから削除されます。データベースが削除を処理するため、これは非常に効率的です。

リスナーを呼び出すcascade={'remove'}必要があります。これにより、Doctrine はオブジェクトのグラフを取得するようになり、処理が遅くなります。

両方のオプションを同時に指定できます。この場合、Doctrine は最後の段落で説明したように動作しますがDELETE、Doctrine から来ていない s も正しくカスケードします。この場合、明らかにリスナーは呼び出されません。

cascade={'remove'}リスナーが呼び出されずに偶発的な s を避けるために、この場合にのみ指定する傾向がありますDELETE(参照されていないファイルのクリーンアップ タスクがない場合)。

詳細はDoctrine のドキュメントにあります。

于 2013-02-22T11:01:24.573 に答える