使用 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 Scout
在 model::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 次查询,与可能的几十次或更多次相比,这仍然是名义上的。
老实说,您可以进一步简化该代码。
我正在 Laravel 中进行批量插入,例如
\App\Example::insert([
[
'name' => 'abc',
'value' => '123',
],
[
'name' => 'def',
'value' => '456',
],
// etc...
]);
这将进行批量插入,一次查询,但仍一次插入多行。
问题是,当我使用 insert()
时,行没有插入到 Algolia。那么我怎样才能对 Algolia 进行批量插入呢?
我不想遍历我的行并一次插入一次,因为这会花费额外的请求
您可以在模型集合上调用 ->searchable()
,正如@Ohgodwhy 在评论中提到的那样。 Scout 的 Algolia 引擎将对多个模型实例的更新进行批处理,从而保持较低的请求总数。
问题是 Laravel Scout
在 model::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 次查询,与可能的几十次或更多次相比,这仍然是名义上的。
老实说,您可以进一步简化该代码。