繁体   English   中英

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

[英]How to mass insert or update in a single query (not a for loop of queries) using Laravel 4.2

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

Collection::insert($cardQueryList);

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

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

我也已经检查了以下链接:

如果不存在则插入新记录,如果存在则更新,laravel eloquent

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

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

通常,您将使用的sql类型将与以下内容类似: -

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

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

<?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不为空,则只运行查询。

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

你可以试试这个:

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

要使其工作,请在Collection模型中添加带有可指定质量的字段名称的$fillable属性,例如:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM