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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:36:20