Laravel Eloquent for循环查询到单个准备好的查询

时间:2016-01-05 23:11:29

标签: php mysql laravel eloquent

需要一些帮助将以下Laravel Eloquent for循环查询转换为单个MySQL查询,该查询一次性访问数据库。基本上,这将根据$ cardQueryList中的项目数量多次命中数据库。

for($i=0; $i<count($cardQueryList); $i++) {
        $userCard = Collection::firstOrNew( ['username' => $cardQueryList[$i]['username'], 'card_uid' => $cardQueryList[$i]['card_uid']] );
        $userCard->have_quantity = $cardQueryList[$i]['have_quantity'];
        $userCard->save();
}

这就是我目前所拥有的:

DB::raw('REPLACE INTO users_collection (username, card_uid, have_quantity) values('.$cardQueryList[$i]["username"].', '.$cardQueryList[$i]["card_uid"].', '.$cardQueryList[$i]["have_quantity"].')');

问题是我使用'username'和'card_uid'作为唯一键来查找要更新的相应行。另一个问题是,这要求我为所有字段指定所有值,否则字段将丢失或替换为默认值。

如何在原始MySQL查询中使用一次而不是像Laravel Eloquent代码中的n次?或者有没有办法用Eloquent打一次数据库(这将是最好的,但我不认为有办法)?

2 个答案:

答案 0 :(得分:0)

根据您的评论

修改,您可以使用以下内容对DB进行批量更新:

DB::table((new Collection)->getTable())->update([
    [
        'field' => 'value',
        'field2' => 'value 2',
    ],
    [
        'field' => 'value',
        'field2' => 'value 3',
    ],
])
->where('some_id', $id);

原始SQL是否真的是您正在寻找的,或者您可以简单地按照以下方式执行某些操作:

foreach ($cardQueryList as $cardQuery) {
    $userCard = Collection::where('username', $cardQuery['username'])
        ->where('card_uid', $cardQuery['card_uid'])
        ->firstOrNew();

    $userCard->have_quantity = $cardQuery['have_quantity'];
    $userCard->save();
}

答案 1 :(得分:0)

这就是我解决它的方法。

$last = count($cardQueryList)-1;

$sql = 'INSERT INTO users_collection (username, card_uid, have_quantity) VALUES ';
for($i=0; $i<$last; $i++) {
   $sql .= '("'. $cardQueryList[$i]['username'] .'", "'. $cardQueryList[$i]['card_uid'] .'", '. $cardQueryList[$i]['have_quantity'] .'), ';
}
$sql .= '("'. $cardQueryList[$last]['username'] .'", "'. $cardQueryList[$last]['card_uid'] .'", '. $cardQueryList[$last]['have_quantity'] .') ';
$sql .= 'ON DUPLICATE KEY UPDATE ';
for($i=0; $i<$last; $i++) {
    $sql .= 'have_quantity = '. $cardQueryList[$i]['have_quantity'] .', ';
}
$sql .= 'have_quantity = '. $cardQueryList[$last]['have_quantity'];

DB::statement($sql);