$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的行时,我想更新相应的行。否则创建一个新行。
答案 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'];