我有一个文本字段在我的数据库和它的前10个字符的索引。我如何在我的学说实体中指定它?
我找不到任何关于数据库特定索引选项的信息:/
这是我的"partial" MySQL create语句:
KEY `sourceaddr_index` (`sourceaddr`(10)),
这是我的@Index在doctrine:
@ORMIndex(name="sourceaddr_index", columns={"sourceaddr"}, options={}),
这并不影响正常使用,但我注意到在将开发部署到新笔记本电脑上并根据我的实体创建数据库时存在问题…
任何帮助都将是感激的:)
可能自原则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测试)。
在MySQL中手动创建索引后,我很幸运地在Doctrine中命名了索引。它既不美观也不优雅,而且如果忘记重新创建索引,很容易导致从开发转移到生产的过程中出现错误。但是,教条主义似乎理解它,尊重它。
在我的实体中,我有以下定义。Doctrine忽略了长度选项——这是我一厢情愿的想法。
/**
* Field
*
* @ORMTable(name="field", indexes={
* @ORMIndex(name="field_value_bt", columns={"value"}, options={"length": 100})
* })
MySQL中,我执行
CREATE INDEX field_value_bt ON field (value(100))
据我所知,Doctrine只是让索引保持不变,只要它的命名相同。
简而言之:你不能在Doctrine中设置这个。Doctrine的ORM特别关注跨厂商的兼容性和你所描述的索引类型,尽管在许多现代RDBMS中得到支持,但在一定程度上超出了Doctrine的处理范围。
不幸的是,没有一个简单的方法来解决这个问题,如果你使用Doctrine的模式更新程序(在Symfony中,这将是php app/console doctrine:schema:update --force
),如果你手动更新数据库,Doctrine有时会回归更改以保持同步。
在我需要这样的东西的情况下,我刚刚设置了一个fixture,通过SQL发送相关的ALTER TABLE
语句。如果你要分发你的代码(即它可能运行在其他/旧的数据库上),你可以用一个平台检查来包装语句,以确保。
这是不理想的,但一旦你的应用/软件稳定,这样的问题应该不会经常发生。