我的数据库中有一个文本字段,前10个字符有一个索引。如何在我的Doctrine Entity中指定它?
我无法在任何地方找到有关索引的数据库特定选项的任何信息:/
这是我的“部分”MySQL创建语句:
KEY `sourceaddr_index` (`sourceaddr`(10)),
这是我在学说中的@Index:
@ORM\Index(name="sourceaddr_index", columns={"sourceaddr"}, options={}),
这个dosnt干扰了常规使用,但是在将开发部署到新笔记本电脑并根据我的实体创建数据库时,我注意到了这个问题......
任何帮助将不胜感激:)
答案 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测试)。