2

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

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

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

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

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

4

2 回答 2

1

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

于 2018-01-23T19:10:58.363 回答
1

问题是Laravel Scout创建Algolio Searchableonmodel::created方法。

您可以在源代码中查看

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

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

 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();
 });

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

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

于 2018-01-23T19:20:41.110 回答