Laravel Scout批量更新数据后如何将其从搜索索引移除?
解决Laravel批量更新同时移除Scout索引的问题
你遇到的核心问题是:查询构造器的update()方法返回的是受影响行数(整数),无法链式调用unsearchable();而且批量更新不会实例化模型,导致shouldBeSearchable()方法不会触发,Scout无法自动处理索引。
可以通过以下步骤实现需求:
先获取目标记录的ID列表
先查询出需要更新的1000条记录的ID,避免后续重复查询的性能损耗:$itemIds = Items::where('state', 2) ->where('active', 1) ->limit(1000) ->pluck('id') ->toArray();执行批量更新
通过ID列表批量更新数据,这个操作高效且不会触发模型事件:if (!empty($itemIds)) { Items::whereIn('id', $itemIds)->update(['active' => 0]); }从Scout索引中移除对应记录
根据ID列表查询出模型集合,调用unsearchable()方法移除索引:if (!empty($itemIds)) { Items::whereIn('id', $itemIds)->get()->unsearchable(); }
补充说明
- 如果需要循环处理所有符合条件的记录(不止1000条),可以用
do-while循环:do { $itemIds = Items::where('state', 2) ->where('active', 1) ->limit(1000) ->pluck('id') ->toArray(); if (empty($itemIds)) { break; } Items::whereIn('id', $itemIds)->update(['active' => 0]); Items::whereIn('id', $itemIds)->get()->unsearchable(); } while (count($itemIds) === 1000); shouldBeSearchable()仅在模型实例被创建或保存(save()/create())时触发,批量更新(查询构造器的update())不会实例化模型,因此无法依赖这个方法自动处理索引。
内容的提问来源于stack exchange,提问作者user2722667
相关产品推荐
相关产品推荐

