Laravel 6中如何从数据库数组字段更新/移除单个值?
解决Laravel中移除数据库数组字段单个值的问题
嘿,我看你现在的问题是想在不删除整个数据库行的前提下,移除scrumboards表中userIds数组字段里的单个用户ID对吧?先说说你当前代码的问题:你写的DB::table('scrumboards')->where('userIds', $userId)->delete()是直接把所有userIds字段等于$userId的行都删掉了,这完全不是你要的效果~咱们来改改:
方法一:用DB门面结合MySQL JSON函数(适合直接用查询构建器的场景)
假设你的userIds字段是MySQL的JSON类型(从你给出的示例["1"]来看应该是),可以用MySQL的JSON函数来精准移除数组中的元素,代码如下:
public function removeUser(Request $request) { $scrumId = $request->scrumId; $userId = $request->userId; // 定位到指定的scrumboard行,然后移除userIds数组中的目标userId DB::table('scrumboards') ->where('id', $scrumId) // 一定要指定scrumId,不然会修改所有包含该userId的行 ->update([ 'userIds' => DB::raw("JSON_REMOVE(userIds, JSON_UNQUOTE(JSON_SEARCH(userIds, 'one', ?)))"), ], [$userId]); return redirect()->back(); }
这里的逻辑是:
JSON_SEARCH(userIds, 'one', ?):找到目标userId在数组中的路径(比如$[0])JSON_UNQUOTE:去掉路径字符串的引号,不然JSON_REMOVE无法识别JSON_REMOVE:根据路径移除对应的数组元素
方法二:用Eloquent模型(更简洁直观)
如果你有对应的Scrumboard模型,用Eloquent来操作数组会更顺手,步骤如下:
- 先在模型里配置字段类型转换,让Eloquent自动处理数组和JSON的转换:
// app/Models/Scrumboard.php class Scrumboard extends Model { protected $fillable = ['title', 'userIds']; // 确保userIds在可填充列表里 protected $casts = [ 'userIds' => 'array', // 把JSON字段自动转成数组 ]; }
- 然后修改控制器代码:
public function removeUser(Request $request) { $scrumId = $request->scrumId; $userId = $request->userId; $scrumboard = Scrumboard::findOrFail($scrumId); $userIds = $scrumboard->userIds; // 找到userId在数组中的位置并移除 if (($key = array_search($userId, $userIds)) !== false) { unset($userIds[$key]); // 重新索引数组,避免出现空索引的情况 $scrumboard->userIds = array_values($userIds); $scrumboard->save(); } return redirect()->back(); }
这个方法的好处是你可以像操作普通PHP数组一样处理userIds,Eloquent会帮你自动完成数组到JSON的转换存储,非常省心~
内容的提问来源于stack exchange,提问作者n212
相关产品推荐
相关产品推荐

