在Laravel中雄辩地执行“ findManyOrCreate”所需的资源最少?

时间:2019-06-27 12:53:28

标签: mysql laravel eloquent

我有来自输入的一系列邮政编码:

$postCodes = collect(["BK13TV", "BK14TV", "BK15TV", "BK16TV"]);

在我的数据库中,我已经有两个邮政编码-“ BK13TV”,“ BK16TV”。

所以我想运行以下内容:

$postCodeModels = PostCode::findManyOrCreate($postCodes->map($postCode) {
 return ['code' => $postCode]
})

我最初的方法是加载所有邮政编码,然后将它们与输入中的postCode进行比较,如下所示:

PostCode::createMany($postCodes->diff(PostCode::all()->pluck('code')))

但是,这意味着我正在加载post_codes表的全部内容,这似乎是错误的。

在理想情况下,这将返回与传递的邮政编码匹配的所有邮政编码模型,并为数据库中不存在的邮政编码创建条目。

1 个答案:

答案 0 :(得分:0)

首先,我需要检索现有的邮政编码:

$existingPostCodes = PostCode::whereIn('code', $postCodes)->get();

在输入中查找尚未存储在数据库中的所有邮政编码:

$newPostCodes = $postCodes->diff($existingPostCode->pluck('code'));

最后检索所有新的邮政编码作为模型:

$postCodeModels = PostCode::whereIn('code', $postCodes)->get();

诚然,这仍然需要三个查询,但确实消除了加载整个表中的数据这一疯狂的事情。