我经常在Entity中更改/添加一些字段,并使用bin/console make:migration
来生成迁移,就像在Rails或Django中一样,这很方便。但是,当我使用“教义关系”(ManyToOne
,OneToMany
...)时,不需要外键约束。
我必须删除在生成的迁移中包含外键约束的行。但是当我对Entity进行一些更改并运行bin/console make:migration
时,它将再次添加外键约束,这很烦人。
我不在乎数据的一致性。
在Django模型ForeignKey中,您可以设置db_constraint=False
,因此迁移不会生成Foreign Key约束。
在学说中是否有类似的设置?
答案 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中重写一个学说类解决了这个问题,对我来说看起来像这样: