通过 eloquent 更新 laravel 中的多行

Posted

技术标签:

【中文标题】通过 eloquent 更新 laravel 中的多行【英文标题】:update multi rows in laravel by eloquent 【发布时间】:2021-12-03 03:48:13 【问题描述】:

假设我们有一个数据库,其中有一张名为fathers 的表;以及另一个名为 children 的表。

我想要所有父亲是妈妈的孩子。

$pls = children::where(['father_id' => 5, 'isGoodBoy' => true])->take(4)->get(); 

我想更改 $pls 并将father_id 设置为7,8,50,55。所以可以在foreach中一一请求:

for ($i = 0; $i < count($pls); $i++) 
    $pls[$i] = $arayWhoWantBaby[$i];
    $pls[$i]->save();

这项工作,但有很多请求......(在这个例子中,1 个获取请求和 4 个更新请求!)

我想通过一个或两个 DB 请求执行此操作,一个从 DB 获取数据,另一个设置新数据,一个请求完成所有工作并更新项目 $pls[0][1][2]...

一件事是 sql 中的“in”关键字用于更新;

【问题讨论】:

由于您尝试使用不同的值更新四个结果中的每一个,因此没有漂亮的方法可以做到这一点。即使使用原始 sql,也意味着在更新查询中使用 case when 哇,我认为这个 grate 解决方案是在 laravel 中安全地执行原始 sql 的方法吗? 好的,绑定输入。 我听人说这种方法不是很安全。无论如何,我不喜欢 orms 作为 elquent 或教义。绑定真的安全吗? 应该是。这就是重点。转义任何恶意输入以防止 sql 注入。我仍然建议你使用 ORM。 【参考方案1】:

这就是我的意思。老实说,我会坚持额外的 4 个查询。像这样的小更新应该不是问题。

另外,这样做不会触发任何 Eloquent 事件。

$father_ids = [7, 8, 50, 55];
$children_ids = children::where(['father_id' => 5, 'isGoodBoy' => true])->take(4)->pluck('id')->all();

$sql = <<<SQL
UPDATE
    children
SET
    father_id = CASE id
        WHEN :children_id_1 THEN :father_id_1
        WHEN :children_id_2 THEN :father_id_2
        WHEN :children_id_3 THEN :father_id_3
        WHEN :children_id_4 THEN :father_id_4
    END
WHERE
    id IN (:children_id_1, :children_id_2, :children_id_3, :children_id_4)
SQL;

$bindings = [
    'children_id_1' => $children_ids[0],
    'children_id_2' => $children_ids[1],
    'children_id_3' => $children_ids[2],
    'children_id_4' => $children_ids[3],
    'father_id_1' => $father_ids[0],
    'father_id_2' => $father_ids[1],
    'father_id_3' => $father_ids[2],
    'father_id_4' => $father_ids[3],
];

DB::update($sql, $bindings);

【讨论】:

以上是关于通过 eloquent 更新 laravel 中的多行的主要内容,如果未能解决你的问题,请参考以下文章

Laravel (Eloquent) 不更新数据库

使用 Laravel Eloquent 使用复合键更新表

Laravel 5.4:使用eloquent和fillable字段更新多个表的多个模型

如何通过分页获取 Laravel Eloquent 中的特定列?

1+X web中级 Laravel学习笔记——Eloquent ORM查询更新删除新增

如何在 laravel 5 中使用 Eloquent 更新数据透视表