出于某些原因,我使用
生成迁移 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;
有没有办法为这些名称定义名称?
更新
我尝试了索引,但没有帮助。
/** * 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)");
答案 0 :(得分:8)
我有更多时间调查了进行生成的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);
}
答案 1 :(得分:5)
您可以自己在实体上定义索引
/**
*
* @ORM\Table(name="company", indexes={@ORM\Index(name="model_partner_idx", columns={"partner"})} )
* @ORM\Entity
*/
class Company