使用Doctrine生成迁移时如何禁用FOREIGN KEY CONSTRAINT?

时间:2019-08-12 04:43:30

标签: symfony doctrine

我经常在Entity中更改/添加一些字段,并使用bin/console make:migration来生成迁移,就像在Rails或Django中一样,这很方便。但是,当我使用“教义关系”(ManyToOneOneToMany ...)时,不需要外键约束。

我必须删除在生成的迁移中包含外键约束的行。但是当我对Entity进行一些更改并运行bin/console make:migration时,它将再次添加外键约束,这很烦人。

我不在乎数据的一致性。

在Django模型ForeignKey中,您可以设置db_constraint=False,因此迁移不会生成Foreign Key约束。

在学说中是否有类似的设置?

3 个答案:

答案 0 :(得分:2)

Doctrine本机不支持此功能,但是您可以使用postGenerateSchema事件的事件监听器来做到这一点。

// src/Doctrine/IgnoreFksListener.php

namespace App\Doctrine;

use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs;

/**
 * see http://kamiladryjanek.com/en/ignore-entity-or-table-when-running-doctrine2-schema-update-command/
 */
class IgnoreFksListener
{

    /**
     * Remove fks from Schema
     * This listener is called when the schema has been generated (from mapping data of entities)
     *
     * @param GenerateSchemaEventArgs $args
     */
    public function postGenerateSchema(GenerateSchemaEventArgs $args)
    {
        $schema = $args->getSchema();
        $em = $args->getEntityManager();

        foreach ($schema->getTables() as $table) {
            $fks = $table->getForeignKeys();
            foreach ($fks as $fk) {
                $table->removeForeignKey($fk->getName());
//              dump('removed FK '.$fk->getName().' from '.$tabel->getName().' pointing to '.$fk->getForeignTableName().'.['.implode(', ', $fk->getForeignColumns()).']');
            }
        }
    }
}

您必须在services.yaml

中注册侦听器
    App\Doctrine\IgnoreFksListener:
        tags:
            - {name: doctrine.event_listener, event: postGenerateSchema }

在这里您可以找到另一个示例 http://kamiladryjanek.com/en/ignore-entity-or-table-when-running-doctrine2-schema-update-command/

答案 1 :(得分:1)

Doctrine不支持此操作。

如果您正在使用关系后端并声明实体之间的关联映射,则生成的代码将包括适当的外键

您不是不需要使用该代码。如果您发现FK不存在,Doctrine将继续正常工作。

  

我不在乎数据一致性

哦,要年轻并且要收费。祝你好运。

答案 2 :(得分:0)

我通过在symfony 4.3中重写一个学说类解决了这个问题,对我来说看起来像这样:

https://stackoverflow.com/a/58559273/9631974