Подтвердить что ты не робот

Как массировать вставку или обновление в одном запросе (а не в цикле запросов) с использованием Laravel 4.2

$cardQueryList = [];
foreach($cards as $cardName => $quantity) {
    $cardQueryList[] = [
        'username' => $user->username,
        'card_uid' => $card->uid,
        'have_quantity' => $quantity
    ];
}

Collection::insert($cardQueryList);

Приведенный выше код создает новые строки, даже если строка существует. Как я могу это сделать, если строка существует, она обновляется. И если он не создает строку? Яркий или Свободный ответ был бы оптимальным, но я открыт для сырых, если нет другого пути.

Я хотел бы сделать массовое обновление/вставку с помощью одного запроса. Не для цикла запросов для каждой записи. В идеале я хотел бы получить доступ к базе данных по понятным причинам.

Также я уже проверил следующую ссылку:

Вставить новую запись, если она не существует, и обновить, если она существует, laravel eloquent

Вышеупомянутое работает для одного обновления/вставки записи. Который, если бы я работал с циклом for, был бы очень медленным. Я ищу ответ, который позволяет массовую вставку/обновление в одном запросе.

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

4b9b3361

Ответ 1

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

    insert into `TABLE` ( `FIELD1`,`FIELD2`, `FIELD3` ) values ( 'VALUE1','VALUE2','VALUE3' )
    on duplicate key
        update
            `FIELD1`='VALUE1',
            `FIELD2`='VALUE2',
            `FIELD1`='VALUE3';

Как бы вы использовали это с laravel, я не мог сказать вам! Oops - забыли имена полей в части обновления

Ответ 2

<?php

$valuesArray = [];

foreach( $cards as $cardName => $quantity ) 
{
    $valuesArray[] = "('".$user->username."','".$card->uid."','".$quantity."')";   
}

$db->query 
(
    "INSERT INTO `TABLE` ( `username`,`card_uid`, `have_quantity` ) VALUES ".implode( ',', $valuesArray )."
    ON DUPLICATE KEY UPDATE `have_quantity` = VALUES(`have_quantity`);"
 );

Убедитесь, что у вас есть первичный ключ для имени пользователя и card_uid. Также не забывайте избегать значений и запускать запрос только в том случае, если $valuesArray не пуст.

Ответ 3

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

Ответ 4

Вы можете попробовать следующее:

Collection::firstOrNew([
    'username' => $user->username,
    'card_uid' => $card->uid,
    'have_quantity' => $cards['quantity']
])
->save();

Чтобы сделать работу, добавьте свойство $fillable с массовыми назначаемыми именами полей в вашей модели Collection, например:

protected $fillable = ['username', 'card_uid', 'have_quantity'];