如何使用 YAML 设置多对一关系“区域”的外键名称(编辑:不是属性本身的名称)?
SWA\TestBundle\Entity\Province:
type: entity
table: province
uniqueConstraints:
UNIQUE_PROVINCE_CODE:
columns: code
id:
id:
type: integer
generator: { strategy: AUTO }
fields:
code:
type: integer
name:
type: string
length: 255
short_name:
type: string
length: 2
manyToOne:
region:
targetEntity: Region
inversedBy: provinces
查看 AbstractPlatform 类中的 getCreateConstraintSQL 方法,了解如何选择外键名称(第 1088 行)。
它直接取自约束名称。影响约束名称将影响外键名称。
作为解决方法,您可以删除约束并在条令迁移中使用新名称重新创建它。
由于@JakubZalas 的回答,我查看了 Github 中的代码,发现更改框架代码来完成你想要的操作非常简单。
如果检查 AbstractPlatform 类所在的文件夹,您会看到有一个foreignkeyconstraint 类。在其中你会看到它继承自 AbstractAsset。
现在 AbstractAsset 类有一个 _generateIdentifierName 方法。如果您在 github 中检查此方法,您会发现它有一个注释部分,可以满足您的需求。您只需取消注释此部分,注释实际活动部分,将 $prefix 参数更改为 $postfix 即可完成。约束名称将使用带有相应后缀的表和列名称生成。 AbstractAsset.php 文件是这个文件夹:Symfony/vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema
我在我的项目中尝试过,效果很好。
最后一个信息:至少对于我的项目,我上面提到的注释部分仅在 github 中,而不是在我本地计算机的文件中。
创建一个监听
postGenerateSchema
的服务,在
services.yaml
中按如下方式标记它:App\Service\Listeners\SchemaListener:
tags:
- {name: doctrine.event_listener, event: postGenerateSchema}
在这里,您将搜索该 FK,删除条令生成的 FK,并按照您想要的方式设置一个新的 FK。
就我而言,我有一个无法更改的外键,必须保持原样:
CREATE TABLE `offer_clicks` (
[...]
CONSTRAINT `ck_landingpage_id` FOREIGN KEY (`lp_id`) REFERENCES `landingpages` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
}
这就是我所做的:
use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs;
class IgnoreSchemaListener
{
public function postGenerateSchema(GenerateSchemaEventArgs $args): void
{
$schema = $args->getSchema();
foreach ($schema->getTables() as $table) {
if ($table->getName() == 'offer_clicks') {
foreach ($table->getForeignKeys() as $fk) {
if ($fk->getName() == 'FK_F98F6EA068DFD1EF') {
$table->removeForeignKey($fk->getName());
$table->addForeignKeyConstraint('landingpages', ['lp_id'], ['id'], ['onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE'], 'ck_landingpage_id');
}
}
}
}
}
}
之后
bin/console doctrine:schema:update --dump-sql
终于会说
[确定]无需更新 - 您的数据库已与当前实体元数据同步。