Laravel 8中如何用whereIn处理多维数组的多条件匹配查询
在Laravel中实现多维数组的多字段匹配查询
针对你需要匹配每组lang_id对应指定level的需求,有两种高效的实现方式:
方法一:循环构建多条件组合
直接遍历多维数组,为每组lang_id和level构建(language_id = ? AND level = ?)的关联条件,用orWhere串联:
// 示例多维数组结构 $language = [ ['lang_id' => 1, 'level' => 'fluent', 'name' => 'English'], ['lang_id' => 2, 'level' => 'basic', 'name' => 'Spanish'], ]; $users = User::join('language_skills', 'users.id', '=', 'language_skills.user_id') ->where(function ($query) use ($language) { foreach ($language as $lang) { $query->orWhere(function ($subQuery) use ($lang) { $subQuery->where('language_skills.language_id', $lang['lang_id']) ->where('language_skills.level', $lang['level']); }); } }) ->select('users.*') ->distinct() // 避免同一用户被多次返回 ->get();
外层where闭包用于包裹所有orWhere条件,确保这组筛选规则独立于其他查询条件。
方法二:多字段whereIn(Laravel 5.7+)
Laravel 5.7及以上版本支持多字段的whereIn语法,先提取数组中lang_id和level的组合,再直接传入查询:
// 提取需要匹配的字段组合 $languagePairs = collect($language)->map(function ($item) { return [$item['lang_id'], $item['level']]; })->toArray(); $users = User::join('language_skills', 'users.id', '=', 'language_skills.user_id') ->whereIn(['language_skills.language_id', 'language_skills.level'], $languagePairs) ->select('users.*') ->distinct() ->get();
这种方式会生成WHERE (language_id, level) IN ((1, 'fluent'), (2, 'basic'))的SQL语句,直接实现每组字段的精准对应匹配,代码更简洁。
关联模型场景的适配
如果User模型已定义languageSkills关联关系,也可以用whereHas实现关联筛选:
$users = User::whereHas('languageSkills', function ($query) use ($languagePairs) { $query->whereIn(['language_id', 'level'], $languagePairs); })->get();
内容的提问来源于stack exchange,提问作者Inaam ul haq
相关产品推荐
相关产品推荐

