gpt4 book ai didi

eloquent - 如何在原始更新查询 laravel 上设置绑定(bind)

转载 作者:行者123 更新时间:2023-12-05 07:11:27 34 4
gpt4 key购买 nike

我想用一个更新查询更新多行。我可以在没有这样的绑定(bind)的情况下做到这一点:

Product::whereIn('id',[1,2,3])->update([
'stock' => DB::raw('CASE id WHEN 1 THEN 1000 WHEN 2 THEN 1001 WHEN 3 THEN 1003 END')
]);

不过,我想对 CASE 语句使用数据绑定(bind)。我试过:

Product::whereIn('id',[1,2,3])->setBindings([1,1,2,2,3,3])->update([
'stock' => DB::raw('CASE id WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? END')
]);
Product::whereIn('id',[1,2,3])->update([
'stock' => DB::raw('CASE id WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? END')
])->setBindings([1,1,2,2,3,3]);

两者都产生错误:

Illuminate/Database/QueryException with message 'SQLSTATE[HY093]: Invalid parameter number (SQL: update `products` set `stock` = CASE id WHEN 2020-03-19 08:58:16 THEN 1 WHEN 2 THEN 3 WHEN ? THEN ? END, `products`.`updated_at` = ? where `id` in (?, ?, ?) and `products`.`deleted_at` is null)'

我也试过:

Product::whereIn('id',[1,2,3])->update([
'stock' => DB::raw('CASE id WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? END')
->setBindings([1,1,2,2,3,3])
]);

这会产生以下错误:

PHP Error: Call to undefined method Illuminate/Database/Query/Expression::setBindings() in Psy Shell code on line 1

最佳答案

仔细查看错误消息后,我发现问题在于更新语句中时间戳的默认绑定(bind)和 whereIn 子句的参数覆盖了我手动设置的绑定(bind)。我的解决方案是将 whereIn 子句切换为 whereRaw 并在更新语句中包含 updated_at:

Product::setBindings([1,1,2,2,3,3,1,2,3])->
whereRaw('`id` in (?, ?, ?)')->
update([
'stock' => DB::raw('case `id` WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? end'),
'updated_at' => DB::raw('now()'),
]);

关于eloquent - 如何在原始更新查询 laravel 上设置绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60754058/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com