Php Symfony2/Doctrine2:Don';t删除架构上的全文索引:更新
为了支持Symfony2中的全文索引,我使用MyISAM镜像表。我们定期将生产数据集复制到该表中,并创建一个SearchEntity,该实体映射表的结构并与实际实体关联。因此,我们可以在SearchRepository上执行搜索查询(使用针对语句生成器的自定义匹配),并通过解析关联来检索找到的实体 现在,当我执行Php Symfony2/Doctrine2:Don';t删除架构上的全文索引:更新,php,mysql,sql,symfony,doctrine-orm,Php,Mysql,Sql,Symfony,Doctrine Orm,为了支持Symfony2中的全文索引,我使用MyISAM镜像表。我们定期将生产数据集复制到该表中,并创建一个SearchEntity,该实体映射表的结构并与实际实体关联。因此,我们可以在SearchRepository上执行搜索查询(使用针对语句生成器的自定义匹配),并通过解析关联来检索找到的实体 现在,当我执行doctrine:schema:updateDoctrine2时,它无法识别该表上的(手动添加的)索引,并希望删除它们。不幸的是,没有一个通知注释会说“但是保持这个索引不变!” 我已经尝
doctrine:schema:update
Doctrine2时,它无法识别该表上的(手动添加的)索引,并希望删除它们。不幸的是,没有一个通知注释会说“但是保持这个索引不变!”
我已经尝试使用一个@Index
注释,该注释的字段与全文索引中的字段相同(前缀为ft\ux)然后手动执行一些SQL,用我的FT索引替换它们,但也失败了:当Doctrine最初使用这些伪索引创建表时,它失败了,因为索引键长度大于1000字节(这在MySQL中是一个硬限制,原因很明显)
问题是:我能建议条令在schema:update命令中保留它在表中找到的索引不变吗?有没有办法将其破解到框架中?每次架构更新后重新创建全文索引非常麻烦:(
搜索实体:
/**
*@ORM\Table(name=“tmp_search2”,options={“engine”=“MyISAM”},
*uniqueConstraints={@ORM\UniqueConstraint(name=“uq”,columns={“language\u id”,“product\u offer\u id”,“product\u group\u id”,“retailer\u id”}),
*索引={@Index(name=“price\u idx”,columns={“product\u offer\u price”}),
*@Index(name=“started_at_idx”,columns={“product_offer_started_at”}),
*@Index(name=“ended_at_idx”,columns={“product_offer_ended_at”}),
*@Index(name=“ft_products”,columns={“product_name”}),
*@Index(name=“ft_product_group”,columns={“product_group_name”}),
*@Index(name=“ft_-product_-retailer”,columns={“retailer_-name”})
* }
* )
*@ORM\Entity(repositoryClass=“SearchRepository”)
*/
类搜索实体
{
/**
*此字段仅用于满足条令对非复合主键的需求。
*@ORM\Id
*@ORM\Column(name=“id”,type=“integer”)
*@ORM\GeneratedValue(strategy=“AUTO”)
*/
私人$searchId;
/**
*@ORM\ManyToOne(targetEntity=“ProductOffer”)
*@ORM\JoinColumn(name=“product\u offer\u id”,referencedColumnName=“id”)
*/
私人$productOffer;
/**
*@var整数
*
*@ORM\Column(name=“product\u offer\u price”,type=“integer”)
*/
私人$价格;
创建tmp_搜索索引的SQL(首先删除保留在那里的条令,然后创建我们的)
将索引ft_产品放在tmp_search2上;
将索引ft_product_组放在tmp_search2上;
在tmp搜索2上删除ft_产品零售商索引;
#导入产品数据,然后。。。
在tmp_search2上创建全文索引ft_products(产品名称、产品短文本、产品长文本);
在tmp_search2(产品组名称)上创建全文索引ft_产品组;
在tmp_search2(零售商名称)上创建全文索引ft_product_retailer;
正如其他人回答的那样,在生产环境中使用
原则:模式:更新
不是一个好主意,因为代码中的任何微小错误都可能导致数据库的一半被删除
我在一个相当大的项目中工作,我们使用原则:模式:更新--dump sql
查找需要执行的查询并手动执行它们
编辑:我还有另外一个建议,如果你不想手动执行查询,你可以处理
条令:模式:更新--dump sql
的输出,过滤你不想执行的查询,并在数据库上运行其余的查询。或者创建一个命令,在更新模式后创建索引,有些类似于myproject:schema:createIndexes
(或其他任何东西)我能够通过迁移解决这个问题,然后添加同名的假索引
迁移使用原始SQL添加了实际的全文索引:
$this->addSql('ALTER TABLE content ADD FULLTEXT fulltext_content(title, description)');
然后,我将索引添加到实体定义中:
@ORM\Table(name="content", indexes={@ORM\Index(name="fulltext_content",columns={"title","description"})})
只要您先生成全文索引,条令将不再删除它们。这不是一个直接的解决方案,但您可以创建自己的控制台命令,该命令在内部执行
条令:schema:update
,然后运行自定义SQL来创建附加索引。因此我永远不会执行条令:schem答:再次更新自身?不,我认为它属于框架,并且在那里很好(每个人都知道它应该如何工作:如果它说,一切都好,一切都好)。我认为在条令方面需要做一些工作来真正解决这个问题;但也许有一些方法可以扩展条令的类型(最好使用捆绑包)因此,全文索引在原则2.5中被正确识别,有一个“标志”选项。设置为“全文”它可以自动创建FT索引:1。我们正处于大规模迁移过程中,每天迁移我们的数据->它可能会发生很大的变化,因此我们必须导入大多数数据。因此,重新创建数据库不是问题。2。仅允许注释实体表以使用MyISAM。表是属。当然,只要你的管理团队不愿意支持,你就必须按照自己的意愿去做