Конечно, вы можете использовать updateOrCreate()
метод.Цитирование из документации :
Вы также можете столкнуться с ситуациями, когда вы хотите обновить существующую модель или создать новую модель, если она не существует.Laravel предоставляет метод updateOrCreate для выполнения этого за один шаг.
$data = collect([
['id' => 1, 'value' => 100],
['id' => 3, 'value' => 20]
]);
$data->each(function ($item) {
Model::updateOrCreate([
['id' => $item['id']],
['value' => $item['value']]
]);
});
Примечание: если вам нужно обрабатывать много записей одновременно, этот метод может привести к медленной обработке, так каквы создаете / обновляете одну модель за раз в базе данных.
Обновление № 1: Сокращение запросов
Затем вы можете немного уменьшить количество запросов с помощью firstOrNew
, так как вы простомассовая вставка новых записей в базу данных, но в настоящее время вам необходимо вручную обновлять уже существующие записи по одной:
$data = collect([
['id' => 1, 'value' => 100],
['id' => 3, 'value' => 20]
]);
$models = $data->map(function ($attributes) {
$model = Model::firstOrCreate([
['id' => $attributes['id']],
['value' => $attributes['value']]
]);
if (! $model->exists) {
$model->fill($attributes);
}
return $model;
});
list($saved, $unsaved) = $models->partition(function ($model) {
return $model->exists;
});
Model::insert($unsaved);
$saved->each->update();
В настоящее время для этого с одним запросом необходимо использовать пакет в соответствии с предложением Йонас Штауденмейр в комментариях.