【问题标题】:How to set bindings on a raw update query laravel如何在原始更新查询 laravel 上设置绑定
【发布时间】:2020-03-19 09:17:06
【问题描述】:

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

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]);

两者都会产生错误:

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 错误:在第 1 行的 Psy Shell 代码中调用未定义的方法 Illuminate/Database/Query/Expression::setBindings()

【问题讨论】:

    标签: eloquent sql-update case prepared-statement laravel-6


    【解决方案1】:

    仔细查看错误消息,我发现问题在于更新语句中时间戳的默认绑定和 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()'),
        ]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-11
      • 1970-01-01
      • 2021-06-24
      • 2019-07-13
      • 2012-10-29
      • 1970-01-01
      • 2015-08-15
      • 2019-11-05
      相关资源
      最近更新 更多