首页 文章

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

提问于
浏览
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("CREATE INDEX IDX_FFE561C6BE3BD8D4 ON agent_task (agentConfig_id)");

实体代码段:

/**
     * @var AgentConfig
     *
     * @ORM\ManyToOne(targetEntity="AgentConfig",inversedBy="agentTasks")
     * @ORM\JoinColumn(name="agent_config_id", referencedColumnName="id")
     */
    private $agentConfig;

有没有办法为这些名称定义名称?

UPDATE

我试过索引,但没有帮助 .

/**
 * AgentTaskConfig
 *
 * @ORM\Table(name="agent_task_config", indexes={@ORM\index(name="agent_task_config_task_id", columns={"task_id"})})
 * @ORM\Entity
 */
class AgentTaskConfig

还在发生:

$this->addSql("ALTER TABLE agent_task_config DROP FOREIGN KEY fk_agent_task_id");
$this->addSql("ALTER TABLE agent_task_config ADD CONSTRAINT FK_7FEDF0EF8DB60186 FOREIGN KEY (task_id) REFERENCES agent_task (id)");

2 回答

  • 7

    有更多的时间我调查了doctrine的(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);
    }
    
  • 4

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

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

相关问题