eloquent - 如何在原始更新查询 laravel 上设置绑定
问题描述
我想用一个更新查询更新多行。我可以在没有这样的绑定的情况下做到这一点:
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 语句使用数据绑定。我努力了:
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]);
两者都会产生错误:
使用消息'SQLSTATE [HY093] 照亮/数据库/查询异常:无效的参数号(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 错误:在第 1 行的 Psy Shell 代码中调用未定义的方法 Illuminate/Database/Query/Expression::setBindings()
解决方案
更仔细地查看错误消息,我发现问题在于更新语句中时间戳的默认绑定和 whereIn 子句的参数覆盖了我手动设置的绑定。我的解决方案是将 whereIn 子句切换到 whereRaw 并在 update 语句中包含 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()'),
]);
推荐阅读
- python - 等待断言变为真,并超时?
- multithreading - macOS 是否使用空闲线程进行调度?如果是这样,我如何监控其统计数据?
- date - 根据Google表格中的当前日期和时间选择“时间描述”(VLookup,Query)
- python - 有没有办法在 python 基础 docker 映像中安装 Firebase CLI?
- python - 我的素数列表中的 3 在哪里附加?
- javascript - 我如何从文本区域进行问题预览,如 Stack Overflow 上的
- python - 使用python导入不同的文件
- windows - 批量比较 2 个数字时输出错误
- ruby - Docker,无法启动容器
- javascript - 方法名与 JS 中的属性名不冲突