jjzjj

php - Symfony2/Doctrine2 : Don't drop fulltext index on schema:update

coder 2023-06-11 原文

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

现在,当我执行 doctrine:schema:update 时,Doctrine2 无法识别该表上的(手动添加的)索引并希望删除它们。不幸的是,没有建议注释说“但保持这个索引完好无损!”。

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

问题是:我可以建议 Doctrine 在 schema:update 命令中完整地保留它在表中找到的索引吗?有没有办法将其破解到框架中?在每次模式更新后重新创建全文索引非常麻烦:(

搜索实体:

/**
 * @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;

创建 tmp_search 索引的 SQL(首先删除那里留下的教义,然后创建我们的)

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 - Symfony2/Doctrine2 : Don't drop fulltext index on schema:update,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19680408/

有关php - Symfony2/Doctrine2 : Don't drop fulltext index on schema:update的更多相关文章

  1. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  2. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  3. ruby - 导轨 4 : column reference "updated_at" is ambiguous with Postgres - 2

    我正在尝试使用“updated_at”字段的日期时间范围查询数据库。前端在JSON数组中发送查询:["2015-09-0100:00:00","2015-10-0223:00:00"]在RailsController中,我使用以下方法将两个字符串解析为DateTime:start_date=DateTime.parse(params[:date_range_arr][0])end_date=DateTime.parse(params[:date_range_arr][1])#...@events=@events.where('updated_atBETWEEN?AND?,start_d

  4. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  5. ruby-on-rails - 在 Rails 中,update_attributes 的倒数是什么? - 2

    在Rails中,update_attributes!的逆运算是什么?换句话说,是什么将记录映射到属性散列以重新创建该记录及其所有子记录?答案不是ActiveRecord.attributes,因为它不会递归到子对象中。澄清您是否有以下情况:classFoo然后你可以像这样传递一个散列{"name"=>"afoo","bars_attributes"=>[{"name"=>"abar}...]}到update_attributes。但目前尚不清楚如何为此目的以编程方式轻松生成这样的哈希值。编辑:正如我在评论中提到的,我可以做类似的事情:foo.as_json(:include=>:bar

  6. ruby-on-rails - rails 3 : Update counter_cache only if published - 2

    这是一个棘手的问题。我有一个包含多种内容类型的项目,例如文章、评论等。每种内容类型都有评论,评论是多态的,因为它们可以属于任何内容类型。我想在我的所有内容页面上放置一个评论总数计数器以显示有多少评论,并且我实现了一个计数器缓存来执行此操作。(@article.comments.count之类的查询更多,并且由于我将Ancestrygem用于线程评论,因此子评论不计入该数字,仅计入根评论。)计数器缓存运行良好并显示评论的准确数量,但一如既往地有一个小问题。评论并不总是立即发布,只有注册用户才能立即发布,并且这些评论的:status为“2”。未注册用户进入审核队列;这些评论的:status

  7. ruby-on-rails - Jobs with Resque gives "Don' t know how to build task 'jobs:work' "on Heroku - 2

    我遵循了https://devcenter.heroku.com/articles/queuing-ruby-resque上的教程在Rails应用程序中排队和运行后台作业。在对作业进行排队后,它似乎没有运行任何作业,因为在控制台中我可以看到作业尚未处理>Resque.info=>{:pending=>1,:processed=>0,:queues=>1,:workers=>0,:working=>0,:failed=>0,:servers=>["redis://dory.redistogo.com:9826/0"],:environment=>"production"}如果我尝试(本地

  8. ruby-on-rails - rails : Faster way to perform updates on many records - 2

    在我们的Rails3.2.13应用程序(Ruby2.0.0+Heroku上的Postgres)中,我们经常从API中检索大量订单数据,然后我们需要在我们的数据库中更新或创建每个订单,因为以及协会。单个订单创建/更新自身加上大约。10-15个关联对象,我们一次最多导入500个订单。下面的代码可以工作,但问题是它在速度方面一点也不高效。创建/更新500条记录大约需要。1分钟并生成6500多个数据库查询!defadd_details(shop,shopify_orders)shopify_orders.eachdo|shopify_order|order=Order.where(:order

  9. ruby-on-rails - after_save 回调将 updated_by 列设置为 current_user - 2

    我想使用after_save回调将updated_by列设置为current_user。但是current_user在模型中不可用。我应该怎么做? 最佳答案 需要在controller中处理。首先在模型上执行保存,然后如果成功则更新记录字段。例子classMyController另一种选择(我更喜欢这个)是在您的模型中创建一个自定义方法来包装逻辑。例如classRecord 关于ruby-on-rails-after_save回调将updated_by列设置为current_user,我

  10. ruby - 我如何在不使用 ruby​​ 中的 sleep() 的情况下 rspec/test 一个 updated_at 字段? - 2

    如何在不使用sleep(1.second)方法的情况下编写规范?当我取消sleep时,我的测试会因为返回相同的时间戳而中断吗?我有以下类方法:defskipqs=find_or_create_by(user_id:user_id)qs.set_updated_atqs.n_skip+=1qs.save!end和以下规范:qs=skip(user.id)sleep(1.second)qs2=skip(user.id)qs.should_notbe_nilqs2.should_notbe_nil(qs.updated_at 最佳答案 我

随机推荐