php – Symfony2 / Doctrine2:不要在模式下删除全文索引:update

前端之家收集整理的这篇文章主要介绍了php – Symfony2 / Doctrine2:不要在模式下删除全文索引:update前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
为了支持Symfony2中的全文索引,我使用了MyISAM镜像表.我们经常将我们的生产数据集复制到该表中,并创建了一个可以映射表的结构并与实体相关联的SearchEntity.因此,我们可以在我们的SearchRepository(使用自定义MATCH AGAINST语句构建器)上执行搜索查询,并通过解析关联来检索找到的实体.

现在,当我执行doctrine:schema:update Doctrine2不能识别该表上的(手动添加)索引,并且想要删除它们.不幸的是,没有任何建议注释说“但是让这个索引保持原样!”.

我已经尝试使用与全文索引(前缀为ft_)相同字段的@Index注释来欺骗Doctrine,然后手动执行某些sql以将其替换为FT索引,但是失败:当Doctrine最初创建表时这些虚拟索引失败,因为索引关键字长度大于1000字节(这是MySQL的明显原因的硬限制)

问题是:我可以建议Doctrine在模式:update命令上完全保留在表上找到的索引吗?有没有办法把它嵌入框架?在每个模式更新后重新创建全文索引是非常繁琐的:(

SearchEntity:

/**
 * @ORM\Table(name="tmp_search2",options={"engine"="MyISAM"},*            uniqueConstraints={@ORM\UniqueConstraint(name="uq",columns={"language_id","product_offer_id","product_group_id","retailer_id"} )},*            indexes={@Index(name="price_idx",columns={"product_offer_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")
  */

class SearchEntity
{
    /**
     * This field is only here to satisfy doctrine's need for a non-composite primary key.
     * @ORM\Id
     * @ORM\Column(name="id",type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
     private $searchId;

   /**
    * @ORM\ManyToOne(targetEntity="ProductOffer")
    * @ORM\JoinColumn(name="product_offer_id",referencedColumnName="id")
    */
    private $productOffer;

   /**
     * @var integer
     *
     * @ORM\Column(name="product_offer_price",type="integer")
     */
    private $price;

sql创建tmp_search索引(首先删除什么教义离开那里,然后创建我们的)

DROP INDEX ft_products ON tmp_search2;
DROP INDEX ft_product_group ON tmp_search2;
DROP INDEX ft_product_retailer ON tmp_search2;

# import product data and then...

CREATE FULLTEXT INDEX ft_products ON tmp_search2 (product_name,product_short_text,product_long_text);
CREATE FULLTEXT INDEX ft_product_group ON tmp_search2 (product_group_name);
CREATE FULLTEXT INDEX ft_product_retailer ON tmp_search2 (retailer_name);
我可以使用迁移解决这个问题,然后添加相同名称的伪索引.

迁移使用原始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"})})

只要您首先生成全文索引,Doctrine将不再删除它们.

猜你在找的PHP相关文章