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
相关产品推荐
相关产品推荐

