由 Doctrine2 (Symfony2) 生成的约束中的奇怪随机名称

Posted

技术标签:

【中文标题】由 Doctrine2 (Symfony2) 生成的约束中的奇怪随机名称【英文标题】:Weird Random names in constrains generated by Doctrine2 (Symfony2) 【发布时间】:2013-09-25 18:53:17 【问题描述】:

由于某种原因,当我使用生成迁移时

php app/console doctrine:migrations:diff

我为 FK_FFE561C6BE3BD8D4 和 IDX_FFE561C6BE3BD8D4 等约束和索引获得了奇怪的名称:

$this->addSql("ALTER TABLE agent_task ADD agentConfig_id INT UNSIGNED DEFAULT NULL, DROP agent_id"); $this->addSql("ALTER TABLE agent_task ADD CONSTRAINT FK_FFE561C6BE3BD8D4 FOREIGN KEY (agentConfig_id) REFERENCES agent_config (id)"); $this->addSql("创建索引 IDX_FFE561C6BE3BD8D4 ON agent_task (agentConfig_id)");

实体代码sn-p:

/** * @var 代理配置 * * @ORM\ManyToOne(targetEntity="AgentConfig",inversedBy="agentTasks") * @ORM\JoinColumn(name="agent_config_id", referencedColumnName="id") */ 私人 $agentConfig;

有什么方法可以定义这些名称吗?

更新

我尝试了索引,但没有帮助。

/** * 代理任务配置 * * @ORM\Table(name="agent_task_config", 索引=@ORM\index(name="agent_task_config_task_id", columns="task_id")) * @ORM\实体 */ 类 AgentTaskConfig

仍在发生:

$this->addSql("ALTER TABLE agent_task_config DROP FOREIGN KEY fk_agent_task_id"); $this->addSql("ALTER TABLE agent_task_config 添加约束 FK_7FEDF0EF8DB60186 FOREIGN KEY (task_id) REFERENCES agent_task (id)");

【问题讨论】:

【参考方案1】:

有更多时间我研究了进行生成的学说 (v2.4.x) SchemaTool.php。看起来他们正在使用方法:

Table#addUnnamedForeignKeyConstraint($foreignTable, array $localColumnNames, array $foreignColumnNames, array $options=array())

不言自明。它被标记为已弃用,并带有以下链接:

Table#addForeignKeyConstraint($foreignTable, array $localColumnNames, array $foreignColumnNames, array $options=array(), $constraintName = null)

此方法有参数 $constraintName,目前未使用。我想唯一的方法是编辑 Schema 工具以使用后一种方法传递您自己的 $constraintName。

约束名称生成如下所示:

protected function _generateIdentifierName($columnNames, $prefix='', $maxSize=30)

    $hash = implode("", array_map(function($column) 
        return dechex(crc32($column));
    , $columnNames));

    return substr(strtoupper($prefix . "_" . $hash), 0, $maxSize);

【讨论】:

请指教如何生成索引?和上面一样吗?除了 IDX_ 而不是前缀?【参考方案2】:

您可以自己在实体上定义索引

/**
 *
 * @ORM\Table(name="company", indexes=@ORM\Index(name="model_partner_idx", columns="partner") )
 * @ORM\Entity
 */
class Company

【讨论】:

是的,但这会创建新索引,但不会更改自动生成索引的名称 可以使用上面的注解覆盖自动生成的索引

以上是关于由 Doctrine2 (Symfony2) 生成的约束中的奇怪随机名称的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 / Doctrine2:不要在模式上删除全文索引:更新

在 Doctrine2/Symfony2 中的重复条目上插入忽略

如何在 Doctrine2 (Symfony2) 中按案例排序

Symfony2 项目中的 Doctrine2 映射问题

Doctrine2 自定义类型不像主键 Symfony2 那样工作

带有 Symfony2 的 Doctrine2 无法识别数据库字符集和排序规则