1. ホーム
  2. php

[解決済み】doctrine2での削除カスケードについて

2022-04-02 17:47:17

質問

Doctrine2 を使って、親テーブルから行を削除し、子テーブルの一致する行を自動的に削除する方法を学ぶために、簡単な例を作ろうとしています。

以下は、私が使用している2つのエンティティです。

Child.php。

<?php

namespace Acme\CascadeBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="child")
 */
class Child {

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @ORM\ManyToOne(targetEntity="Father", cascade={"remove"})
     *
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="father_id", referencedColumnName="id")
     * })
     *
     * @var father
     */
    private $father;
}

お父さん.php

<?php
namespace Acme\CascadeBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="father")
 */
class Father
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
}

データベース上にテーブルは正しく作成されますが、On Delete Cascadeオプションは作成されません。私は何を間違えているのでしょうか?

どうすればいいですか?

Doctrine には 2 種類のカスケードがあります。

1) ORMレベル cascade={"remove"} これはUnitOfWorkで行われる計算であり、データベース構造には影響しない。 オブジェクトを削除すると、UnitOfWorkはアソシエーション内のすべてのオブジェクトを繰り返し、それらを削除します。

2) データベースレベル - 以下のものを使用します。 onDelete="CASCADE" をアソシエーションのjoinColumnに追加することで、データベースの外部キーカラムにOn Delete Cascadeが追加されます。

@ORM\JoinColumn(name="father_id", referencedColumnName="id", onDelete="CASCADE")

また、cascade={"remove"}を設定した場合、子オブジェクトを削除すると、このカスケードによって親オブジェクトが削除されてしまうことを指摘しておきます。明らかに、あなたが望むものではありません。