我有来自输入的一系列邮政编码:
$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表的全部内容,这似乎是错误的。
在理想情况下,这将返回与传递的邮政编码匹配的所有邮政编码模型,并为数据库中不存在的邮政编码创建条目。
答案 0 :(得分:0)
首先,我需要检索现有的邮政编码:
$existingPostCodes = PostCode::whereIn('code', $postCodes)->get();
在输入中查找尚未存储在数据库中的所有邮政编码:
$newPostCodes = $postCodes->diff($existingPostCode->pluck('code'));
最后检索所有新的邮政编码作为模型:
$postCodeModels = PostCode::whereIn('code', $postCodes)->get();
诚然,这仍然需要三个查询,但确实消除了加载整个表中的数据这一疯狂的事情。