Что является наименее ресурсоемким для выполнения "findManyOrCreate" в Laravel eloquent? - PullRequest
0 голосов
/ 27 июня 2019

У меня есть массив почтовых индексов, поступающих со входа:

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

В моей базе данных у меня уже есть два почтовых кода - "BK13TV", "BK16TV".

Поэтому я хотел бы запустить что-то вроде этого:

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

Мой первоначальный подход состоял в том, чтобы загрузить все почтовые коды, а затем разнести их по почтовым кодам из входных данных следующим образом:

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

Однако здесь это означает, что я загружаю все содержимое таблицы post_codes, что кажется неправильным.

В идеальном случае это вернет все модели почтовых индексов, соответствующие переданным почтовым индексам, а также создаст записи для почтовых индексов, которых не было в базе данных.

1 Ответ

0 голосов
/ 27 июня 2019

Сначала мне нужно получить существующие почтовые индексы:

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

Найти все почтовые индексы на входе, которые еще не сохранены в базе данных:

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

Наконец получить всеновые почтовые индексы в качестве моделей:

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

По общему признанию, это все еще занимает три запроса, но устраняет сумасшедшие вещи загрузки всей таблицы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...