Laravel中updateOrInsert结合foreach批量赋值数据库多字段失败,如何正确插入动态值?
搞定这个ORM操作的小问题!
嘿,你遇到的问题其实很明确:Laravel的updateOrInsert方法需要接收一个单层的关联数组(键是数据库字段名,值是对应要更新/插入的值),但你现在的代码生成的是一个包含多个小关联数组的嵌套数组,这种结构ORM根本没法识别,自然就操作失败了。
最简单的修复方式
你不需要每次循环都往$update里push一个新数组,直接给$update这个数组赋值键值对就行:
$update = []; foreach ($userPermissions->getPermissionNames() as $t) { // 直接给$update添加字段名和对应值,一步到位 $update[$t] = in_array($t, $permissions) ? 1 : 0; } // 现在$update的结构就变成了正确的格式: // ["is_admin" => 1, "is_something_else" => 1] UserPermission::updateOrInsert(['user_id' => $user->id], $update);
这样修改后,$update就是Laravel期望的格式,updateOrInsert就能顺利执行更新或者插入操作了。
更简洁的写法(用集合)
如果你喜欢Laravel集合的链式调用,也可以用mapWithKeys来简化代码,看起来更清爽:
$update = collect($userPermissions->getPermissionNames()) ->mapWithKeys(function ($permissionName) use ($permissions) { return [$permissionName => in_array($permissionName, $permissions) ? 1 : 0]; }) ->toArray(); UserPermission::updateOrInsert(['user_id' => $user->id], $update);
mapWithKeys会帮你直接生成想要的单层关联数组,省去了手动循环赋值的步骤,代码更优雅。
内容的提问来源于stack exchange,提问作者Klapsius
相关产品推荐
相关产品推荐

