当前位置: 首页 > 知识库问答 >
问题:

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

微生令雪
2023-03-14
$cardQueryList = [];
foreach($cards as $cardName => $quantity) {
    $cardQueryList[] = [
        'username' => $user->username,
        'card_uid' => $card->uid,
        'have_quantity' => $quantity
    ];
}

Collection::insert($cardQueryList);

即使行存在,上述代码也会创建新行。如果行存在,我如何使它更新。如果没有,它会创建行?雄辩或流利的回答是最佳的,但如果没有其他方法,我对原始的回答持开放态度。

我想用一个查询进行大规模更新/插入。不是每个记录的for查询循环。理想情况下,出于明显的原因,我希望访问数据库一次。

另外,我已经检查了以下链接:

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

上述操作适用于单个记录更新/插入。如果我运行for循环,速度会非常慢。我正在寻找一个在单个查询中允许大规模插入/更新的答案。

注意:我使用“用户名”和“卡号”作为我的密钥。所以基本上,当我发现一行有用户名和卡号时,我想更新相应的行。否则,创建新行。

共有3个答案

丁雅惠
2023-03-14

如果不需要重复项,请让DB模式阻止重复项的输入。捕获本例中的错误,然后继续。

穆智刚
2023-03-14
<?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`);"
 );

确保用户名和卡uid上有主键。另外,不要忘记转义值,并且仅在$valuesArray不为空时运行查询。

阙辰龙
2023-03-14

通常情况下,您将使用的sql的排序大致如下:-

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

我不能告诉你,你会怎么用这个来对付拉威尔!Oops-忘记了更新部分中的字段名

 类似资料:
  • 我试图在spring jpa中更新多个表。正在更新使用者表,但提供者表无法更新。相反,它尝试插入导致违反主键,这是预期的,因为它尝试插入而不是更新。虽然我对这两个表的代码流是相同的,但只有生产者有问题。这是我的消费者实体 这是我的消费者存储库 这是我的提供商实体 这是我的提供商存储库 这是日志

  • 问题内容: 在我的tempTBL上,我的linksTBL上有ID,名称,URL,猫,被插入的列TBL我的类别上的ID:名称,别名列在TBL上我在extraTBL上有:cl_id,link_id,cat_id我有:id,link_id,值 我如何执行单个查询以从tempTBL中选择isinsrted = 0的所有项目,然后将它们插入linksTBL并为插入的每个记录选择拾取ID(主要的),然后将该I

  • 问题内容: 有什么方法可以简化为一个查询吗? 问题答案: 是的,您可以使用以下查询进行操作:

  • 我使用。 我每秒接收15万个请求,并将其插入到具有不同分区键的8个表中。 我的问题是哪种方式更好: 批量插入这些表 一个接一个地插入。 我问这个问题是因为,考虑到我的请求大小(150k),批处理听起来是更好的选择,但是因为所有的表都有不同的分区键,所以批处理显得很昂贵。

  • 嗨,我的数据库结构如下: 表:分析 现在我想批量更新数据。例如,我想选择用户_id=1的数据以及2016-03-01和2016-03-20之间的日期。然后我想将结果中得到的所有记录的列从0更新为1。 我所做的工作如下: 但这不起作用,也没有显示任何错误。请让我知道在雄辩的帮助下我能做什么。提前谢谢。 我也看到了StackoverFlow中的其他问题,但答案建议运行foreach循环,这是我不想要的

  • 问题内容: 我有这样的简单表: 我想更新哪里的行,但是如果没有行我想更新的行: 仅可能进行一次查询吗? 问题答案: 你可以利用 列上应该有UNIQUE索引 SQLFiddle