5

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

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)");

实体代码片段:

    /**
     * @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)");
4

2 回答 2

8

有更多的时间我研究了生成的学说(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);
}
于 2013-09-30T12:21:30.517 回答
5

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

/**
 *
 * @ORM\Table(name="company", indexes={@ORM\Index(name="model_partner_idx", columns={"partner"})} )
 * @ORM\Entity
 */
class Company
于 2013-09-20T12:08:17.383 回答