如何使用Laravel 4.2在单个查询(而不是for循环查询)中批量插入或更新

时间:2015-07-25 15:40:44

标签: php mysql laravel eloquent fluent

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

Collection::insert($cardQueryList);

即使该行存在,上述代码也会创建新行。如果行存在,我该怎么做才会更新。如果它没有创建行?一个雄辩或流利的答案是最佳的,但如果没有别的办法,我可以接受原始答案。

我想用单个查询进行批量更新/插入。不是每个记录的for循环查询。理想情况下,出于显而易见的原因,我想打一次数据库。

此外,我已经检查过以下链接:

Insert a new record if not exist and update if exist, laravel eloquent

以上适用于单个记录更新/插入。如果我使用for循环运行会非常慢。我正在寻找一个允许在单个查询中进行批量插入/更新的答案。

注意:我正在使用,用户名'和' card_uid'作为我的钥匙。所以基本上当我找到一个包含所述用户名和card_uid的行时,我想更新相应的行。否则创建一个新行。

4 个答案:

答案 0 :(得分:4)

通常,您将使用的sql类型将如下所示: -

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

你怎么用laravel我不能告诉你!糟糕 - 忘记了更新部分中的字段名称

答案 1 :(得分:3)

<?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不为空,也不要忘记转义值并仅运行查询。

答案 2 :(得分:0)

如果您不希望重复项,则数据库架构会阻止重复条目的输入。在这种情况下捕获错误,然后继续。

答案 3 :(得分:0)

你可以试试这个:

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

要使其正常运行,请在$fillable模型中添加带有可分配字段名称的Collection属性,例如:

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