【问题标题】:How to disable FOREIGN KEY CONSTRAINT when using Doctrine generate migration?使用 Doctrine 生成迁移时如何禁用 FOREIGN KEY CONSTRAINT?
【发布时间】:2019-12-18 17:03:25
【问题描述】:

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

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

我不关心数据的一致性。

在Django模型ForeignKey中可以设置db_constraint=False,所以迁移不会产生外键约束。

Doctrine 中是否有类似的设置?

【问题讨论】:

  • 很抱歉,正如我在回答中所说,Doctrine 中确实没有内置方法可以做到这一点。如果您真的不想要 FK 并且想使用学说自动生成模式;您必须手动删除这些语句。
  • 但是当我创建/更改某些实体迁移时,它会一次又一次地自动生成Foreign Key Constraint
  • 是的,它会的。如果使用 Doctrine 生成修改模式,则会生成这些 FK 约束。同样,正如我在回答中所说,Doctrine 不支持在关系后端不使用 FK 的情况下进行关联映射。
  • 您可以使用附加到postGenerateSchema 事件的侦听器中的一些代码来执行此操作。看我的回答。

标签: symfony doctrine


【解决方案1】:

教义不支持这一点。

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

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

我不关心数据的一致性

哦,年轻和照顾费。祝你好运。

【讨论】:

  • 在某些情况下,由于当前设计的不必要锁定,FK 会导致性能问题。 stackoverflow.com/questions/49852942/… 我也在寻找一种系统的方法来禁用它。感谢大家提供的答案。
【解决方案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/

【讨论】:

    猜你喜欢
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    相关资源
    最近更新 更多