sql >> データベース >  >> RDS >> Mysql

Doctrine外部キー制約を無効にする

    定義 キーをnullに設定せずに外部キーが指しているレコードを削除することはできません(onDelete="SET NULL" )または削除操作をカスケードする(2つのオプションがあります -ORMレベル:cascade={"remove"} |データベースレベル:onDelete="CASCADE" )。
    既存のレコードのデフォルト値を設定する 、しかし手動で行う必要があります。Doctrineはこの「すぐに使える」サポートはないと思います(間違っている場合は訂正してください。ただし、この場合、デフォルト値を設定することは望ましくありません)。

    この厳密さは、外部キー制約を持つという概念を反映しています。 @Théoが言ったように:

    ソフト削除(すでに説明)は1つの解決策ですが、追加のremoved_page_idを追加することもできます。 page_idと同期する列 preRemoveで削除する直前 イベントハンドラー(ライフサイクルコールバック)。そのような情報に価値があるかどうか疑問に思いますが、あなたはそれをある程度利用していると思います。そうでなければ、この質問をしないでしょう。

    私は間違いなくこれが良い習慣だとは主張していません 、しかし、それは少なくともエッジケースに使用できるものです。つまり、次のようなものです:

    Revisionで :

    /**
     * @ORM\ManyToOne(targetEntity="Page", cascade="persist")
     * @ORM\JoinColumn(name="page_id", referencedColumnName="id", onDelete="SET NULL")
     */
    private $parentPage;
    
    /**
     * @var int
     * @ORM\Column(type="integer", name="removed_page_id", nullable=true)
     */
    protected $removedPageId;
    

    次に、Pageで :

    /** 
     * @ORM\PreRemove 
     */
    public function preRemovePageHandler(LifecycleEventArgs $args)
    {
        $entityManager = $args->getEntityManager();
        $page = $args->getEntity();
        $revisions = $page->getRevisions();
        foreach($revisions as $revision){
            $revision->setRemovedPageId($page->getId());
            $entityManager->persist($revision);
        }
        $entityManager->flush();
    }
    

    または、もちろん、正しい$removedPageIdをすでに設定することもできます。 Revisionの作成中の値 、その後、削除時にライフサイクルコールバックを実行する必要はありません。



    1. TIME()の例– MySQL

    2. SQLAlchemyリフレクション:特定の列からデータをクエリするにはどうすればよいですか?

    3. Doctrine2でSQLのYEAR()、MONTH()、DAY()を使用するにはどうすればよいですか?

    4. データベースにblobとしてファイルを保存するajaxphppdo