我正尝试将约3,000个项目推入表中-我不确定是否可行,但我觉得我的控制器可以通过一些优化达到这一水平。当前需要60秒钟以上的时间才能超时。
super(props)
答案 0 :(得分:0)
您有一些选择。第一件事是您不需要循环运行这些查询。您知道要查找的所有items
,因此可以同时查询3个表中的所有项目(3个独立查询中的UNION)。然后,您可以获得原始items
列表与数据库中存在的列表之间的区别:
if ($request->has('items')) {
$items = (array) $request->input('items');
$exists = QueueItem::whereIn('item', $items)
->select('item')
->union(QueueItemFailed::whereIn('item', $items)->select('item'))
->union(CacheItem::whereIn('item', $items)->select('item'))
->pluck('item');
// get the difference between the input items and the existing items
$insert = collect($items)->diff($exists)->transform(function ($item) {
return ['item' => $item];
})->toArray();
QueueItem::insert($insert);
return response()->json([
'success' => true,
], 200);
}
Laravel 6.x Docs - Query Builder - Unions union
Laravel 6.x Docs - Query Builder - Retrieving Results - Retrieving A List Of Column Values pluck
Laravel 6.x Docs - Collections - Available Methods - diff
Laravel 6.x Docs - Collections - Available Methods - transform
如果遇到某个参数限制或类似的限制,可以对$items
进行分块,也可以对$inserts
进行分块以进行插入。