Laravel8 从嵌套集合数组提取question_id用于whereIn查询
Laravel 8 提取多层嵌套JSON结构中所有question_id的实现方案
直接用Laravel自带的集合方法处理即可,无需手写复杂嵌套循环,代码简洁易维护。
具体实现代码
// 假设$record是你从数据库取到的模型实例,`config_data`是存储该JSON结构的字段名 // 1. 解析JSON为数组(如果模型中已配置字段array类型转换,可跳过json_decode步骤) $groups = collect(json_decode($record->config_data, true)); // 2. 提取所有question_id生成一维数组 $ids = $groups ->flatMap(fn ($group) => $group['questions']) ->pluck('question_id') // 如需去重可放开下面这行注释 // ->unique() ->toArray();
执行完上述代码后,$ids就是你需要的[34,35,36,104,103]格式一维数组,可以直接传入查询构造器使用:
$questionList = Question::whereIn('id', $ids)->get();
可选:原生PHP循环实现
如果你不想用集合方法,用两层foreach遍历也能实现同样效果:
$rawData = json_decode($record->config_data, true); $ids = []; foreach ($rawData as $group) { foreach ($group['questions'] as $question) { $ids[] = $question['question_id']; } } // 去重可加:$ids = array_unique($ids);
优化建议
建议在对应模型中给存储JSON的字段添加类型转换,后续使用时无需手动调用
json_decode,框架会自动完成数组和JSON字符串的互转:// 放在对应模型类中 protected $casts = [ // 其他字段的类型转换... 'config_data' => 'array', ];
内容的提问来源于stack exchange,提问作者fionka
相关产品推荐
相关产品推荐

