[英]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.