首页 文章

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

提问于
浏览
14
$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循环运行会非常慢 . 我正在寻找一个允许在单个查询中进行批量插入/更新的答案 .

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

4 回答

  • 0

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

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

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

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

  • 0

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

  • 3

    你可以试试这个:

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

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

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

相关问题