在 Dotrine 2 ORM 中命名关系?

问题描述 投票:0回答:3

如何使用 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
symfony doctrine doctrine-orm yaml
3个回答
17
投票

查看 AbstractPlatform 类中的 getCreateConstraintSQL 方法,了解如何选择外键名称(第 1088 行)。

它直接取自约束名称。影响约束名称将影响外键名称。

作为解决方法,您可以删除约束并在条令迁移中使用新名称重新创建它。


2
投票

由于@JakubZalas 的回答,我查看了 Github 中的代码,发现更改框架代码来完成你想要的操作非常简单。

如果检查 AbstractPlatform 类所在的文件夹,您会看到有一个foreignkeyconstraint 类。在其中你会看到它继承自 AbstractAsset。

现在 AbstractAsset 类有一个 _generateIdentifierName 方法。如果您在 github 中检查此方法,您会发现它有一个注释部分,可以满足您的需求。您只需取消注释此部分,注释实际活动部分,将 $prefix 参数更改为 $postfix 即可完成。约束名称将使用带有相应后缀的表和列名称生成。 AbstractAsset.php 文件是这个文件夹:Symfony/vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema

我在我的项目中尝试过,效果很好。

最后一个信息:至少对于我的项目,我上面提到的注释部分仅在 github 中,而不是在我本地计算机的文件中。


0
投票

创建一个监听

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

终于会说


[确定]无需更新 - 您的数据库已与当前实体元数据同步。

© www.soinside.com 2019 - 2024. All rights reserved.