You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中如何将stdClass转为数组实现数据库更新?

Laravel中解决stdClass转数组用于数据库update的问题

报错信息

Illuminate\Database\Query\Builder::update(): 参数#1 ($values) 必须为array类型,传入的是stdClass

问题代码

$currentSubscriptionTransaction = new stdClass();

$subscription_transaction_to_update = DB::table('subscription_transactions')->where('id', $currentSubscriptionTransaction->id)->first();

if (!is_null($subscription_transaction_to_update)) {
    DB::table('subscription_transactions')->where('id', $currentSubscriptionTransaction->id)->update(
        ($currentSubscriptionTransaction)
    );
}

你尝试的array($currentSubscriptionTransaction)无效,是因为这种写法会把整个对象包裹成一个一维数组(格式为[stdClass Object]),而Laravel的update()方法需要的是键值对关联数组(键对应数据库字段名,值对应要更新的内容)。

可行解决方案

方案1:使用get_object_vars()转换

get_object_vars()可以直接提取stdClass对象的公共属性,生成符合要求的关联数组:

if (!is_null($subscription_transaction_to_update)) {
    $updateData = get_object_vars($currentSubscriptionTransaction);
    DB::table('subscription_transactions')->where('id', $currentSubscriptionTransaction->id)->update($updateData);
}

方案2:JSON序列化转换

如果对象存在嵌套结构,用JSON转换的方式更通用:

if (!is_null($subscription_transaction_to_update)) {
    $updateData = json_decode(json_encode($currentSubscriptionTransaction), true);
    DB::table('subscription_transactions')->where('id', $currentSubscriptionTransaction->id)->update($updateData);
}

额外优化:过滤不需要更新的字段

如果currentSubscriptionTransaction包含不需要更新的字段(比如id),可以用Laravel的工具类过滤:

use Illuminate\Support\Arr;

if (!is_null($subscription_transaction_to_update)) {
    $updateData = Arr::except(get_object_vars($currentSubscriptionTransaction), ['id']);
    DB::table('subscription_transactions')->where('id', $currentSubscriptionTransaction->id)->update($updateData);
}

注意事项

  • 确保currentSubscriptionTransaction的属性名和subscription_transactions表的字段名完全一致,否则会触发字段不存在的报错。
  • 如果对象包含非数据库字段的属性,必须过滤后再传入update()方法。

内容的提问来源于stack exchange,提问作者ZemichaelMD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 03:55:25