在Doctrine中配置索引文本长度MySQL

时间:2015-09-12 14:33:29

标签: mysql symfony doctrine-orm

我的数据库中有一个文本字段,前10个字符有一个索引。如何在我的Doctrine Entity中指定它?

我无法在任何地方找到有关索引的数据库特定选项的任何信息:/

这是我的“部分”MySQL创建语句:

 KEY `sourceaddr_index` (`sourceaddr`(10)),

这是我在学说中的@Index:

 @ORM\Index(name="sourceaddr_index", columns={"sourceaddr"}, options={}), 

这个dosnt干扰了常规使用,但是在将开发部署到新笔记本电脑并根据我的实体创建数据库时,我注意到了这个问题......

任何帮助将不胜感激:)

3 个答案:

答案 0 :(得分:4)

在MySQL中手动创建索引之后,我已经非常幸运地在Doctrine中命名索引。它不漂亮或优雅,如果您忘记重新创建索引,它很容易导致错误从开发转移到生产。但是,Doctrine似乎理解它尊重它。

在我的实体中,我有以下定义。学说忽略了长度选择 - 这是我一厢情愿的想法。

MyViewController

在MySQL中,我执行

/**
  * Field
  *
  * @ORM\Table(name="field", indexes={
  *     @ORM\Index(name="field_value_bt", columns={"value"}, options={"length": 100})
  * })

就我所见,只要它的名字相同,Doctrine就会单独留下索引。

答案 1 :(得分:2)

简而言之:你无法在Doctrine中设置它。 Doctrine的ORM专注于跨供应商的兼容性,并且您描述的索引类型虽然在许多现代RDBMS中得到支持,但在某种程度上超出了Doctrine的处理范围。

不幸的是,如果您使用Doctrine的架构更新程序(在Symfony中将是php app/console doctrine:schema:update --force),就像手动更新数据库一样,没有一个简单的方法,Doctrine有时会退回改变以保持同步。

在我需要这样的事情的情况下,我只需设置一个fixture,通过SQL发送相关的ALTER TABLE语句。如果您要分发代码(即它可能在其他/较旧的数据库上运行),您可以使用platform check包装该语句以确保。

这并不理想,但一旦你的应用/软件稳定下来,这样的问题就不应该经常发生。

答案 2 :(得分:1)

自Doctrine 2.9起可能出现,请参见:https://github.com/doctrine/dbal/pull/2412

@Index(name="slug", columns={"slug"}, options={"lengths": {191}})

不幸的是,Doctrine似乎对空白位置非常挑剔,例如update --dump-sql产生:

 DROP INDEX slug ON wp_terms;
 CREATE INDEX slug ON wp_terms (slug(191));

,即使您执行了这些操作,它们的消息也将保留在此处(已通过MariaDB 10.3.14测试)。