使用 insert() 并进行批量插入似乎不会触发带有 scout 的插入到 Algolia

using insert() and doing a bulk insert doesnt seem to trigger a insert with scout into Algolia

我正在 Laravel 中进行批量插入,例如

\App\Example::insert([
    [
        'name' => 'abc',
        'value' => '123',
    ],
    [
        'name' => 'def',
        'value' => '456',
    ],
    // etc...
]);

这将进行批量插入,一次查询,但仍一次插入多行。

问题是,当我使用 insert() 时,行没有插入到 Algolia。那么我怎样才能对 Algolia 进行批量插入呢?

我不想遍历我的行并一次插入一次,因为这会花费额外的请求

您可以在模型集合上调用 ->searchable(),正如@Ohgodwhy 在评论中提到的那样。 Scout 的 Algolia 引擎将对多个模型实例的更新进行批处理,从而保持较低的请求总数。

问题是 Laravel Scoutmodel::created 方法上创建了 Algolio Searchable

You can view that here in the source code.

由于 Laravel 不会在 Mass Events 上产生 created/updated/deleted 事件,这意味着 Algolio 也永远不会收到这些事件。

解决此问题的一个方法是采用最新的自动递增 ID,然后在插入后再次采用该 ID,然后在关系的过滤 where 子句上调用 ->searchable(),如下所示:

 DB::transaction(function() {
    $currentId = \App\Example::max('id');
    // do the insert
    $lastId = \App\Example::max('id');

    \App\Example::where('id', '>', $currentId)->where('id', '<=', $lastId)->searchable();
 });

通过使用 transaction,我们确保 $lastId 不会被并行查询破坏。这样,我们必须执行 4 次查询,与可能的几十次或更多次相比,这仍然是名义上的。

老实说,您可以进一步简化该代码。