Массовый подъем в Ларавеле (Красноречивый) - PullRequest
0 голосов
/ 07 апреля 2019

Есть ли способ массового удаления (вставки или обновления, если существует) записей в Laravel (база данных MySQL)?

Скажем, у меня есть таблица с:

[id:1 value:4]
[id:2 value:5]

Я хочувыполнить:

Model::massupsert([
  [id:1 value:100],
  [id:3 value:20]
]);

А таблица потом будет:

[id:1 value:100]
[id:2 value:5]
[id:3 value:20]

Ответы [ 2 ]

1 голос
/ 07 апреля 2019

Laravel не имеет встроенной поддержки UPSERT.

Я создал пакет для этого: https://github.com/staudenmeir/laravel-upsert

Model::upsert([
    ['id' => 1, 'value' => 100],
    ['id' => 3, 'value' => 20],
], 'id', ['value']);
1 голос
/ 07 апреля 2019

Конечно, вы можете использовать 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();

В настоящее время для этого с одним запросом необходимо использовать пакет в соответствии с предложением Йонас Штауденмейр в комментариях.

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