Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony2/Doctrine2:Don';t删除架构上的全文索引:更新_Php_Mysql_Sql_Symfony_Doctrine Orm - Fatal编程技术网

Php Symfony2/Doctrine2:Don';t删除架构上的全文索引:更新

Php Symfony2/Doctrine2:Don';t删除架构上的全文索引:更新,php,mysql,sql,symfony,doctrine-orm,Php,Mysql,Sql,Symfony,Doctrine Orm,为了支持Symfony2中的全文索引,我使用MyISAM镜像表。我们定期将生产数据集复制到该表中,并创建一个SearchEntity,该实体映射表的结构并与实际实体关联。因此,我们可以在SearchRepository上执行搜索查询(使用针对语句生成器的自定义匹配),并通过解析关联来检索找到的实体 现在,当我执行doctrine:schema:updateDoctrine2时,它无法识别该表上的(手动添加的)索引,并希望删除它们。不幸的是,没有一个通知注释会说“但是保持这个索引不变!” 我已经尝

为了支持Symfony2中的全文索引,我使用MyISAM镜像表。我们定期将生产数据集复制到该表中,并创建一个SearchEntity,该实体映射表的结构并与实际实体关联。因此,我们可以在SearchRepository上执行搜索查询(使用针对语句生成器的自定义匹配),并通过解析关联来检索找到的实体

现在,当我执行
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;
  • 您不应该在生产上使用条令:模式:更新。请改用迁移
  • 我记得条令2并没有MyIsam的完全支持,但您可以手动创建表并使用它
  • Mysql全文搜索不是搜索的最佳选择。也许Sphinx或Lucene更适合您的任务

  • 正如其他人回答的那样,在生产环境中使用
    原则:模式:更新
    不是一个好主意,因为代码中的任何微小错误都可能导致数据库的一半被删除

    我在一个相当大的项目中工作,我们使用
    原则:模式:更新--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。表是属。当然,只要你的管理团队不愿意支持,你就必须按照自己的意愿去做