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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 07:54:20