Laravel QueryBuilder 多列在同一个 WhereIn 中匹配

Laravel QueryBuilder multiple columns match in the same WhereIn

我希望在 Laravel Eloquent 中转换像这样的 SQL 查询。 此查询适用于 MariaDb,但我不知道其他引擎(可能是未实施的原因):

id year country enabled
0 2000 "France" 0
1 2001 "Spain" 0
2 2002 "France" 1
3 2003 "Germany" 1

SELECT id FROM my_db.countries WHERE (name, enabled) IN (("France", 1), ("Spain", 0));

This returns 1 and 2.

这可以通过 Eloquent 实现(如此处建议:laravel whereIn multiple columns 但不会 return 预期结果:

DB::table('countries')->select('id')->whereIn('name', ["france", "Spain"])->whereIn('enabled', [0, 1])->all();

This returns 0, 1 and 2.

我试过调整 Illuminate/Database 库以满足我的需要,但数据绑定开始变得非常复杂。

我设法用 whereRaw 查询实现了它,但它对于生产代码来说还不够干净,因为没有数据绑定(值显示为 ->toSql())。

有人知道吗?

我想你想要获得满足两个条件的记录。 whereIn 检查该列是否包含数组中的值之一。

`DB::table('countries')->select('id')->whereIn('name', ["france", "Spain"])->whereIn('enabled', [0, 1])->all();` 

该代码 returns 组合法国 0、法国 1、西班牙 0、西班牙 1。 要获得法国 0 和西班牙 1 的组合,您可以使用此代码

DB::table('countries')
            ->select('id')
            ->where(function(Builder $builder) {
                $builder
                    ->where('name', 'france')
                    ->where('enabled', 0);
            })
            ->orWhere(function(Builder $builder) {
                $builder
                    ->where('name', 'Spain')
                    ->where('enabled', 1);
            })
            ->get();

它检查条件name = france and enabled = 0一起工作

您要获取的查询语法:

SELECT id FROM my_db.countries WHERE (name, enabled) IN (("France", 1), ("Spain", 0));

Oracle 独有。 Laravel 的 whereIn 方法支持 (String, Array),所以我认为您只能选择通过原始查询或使用 V-K

提出的解决方案来完成

如果您添加一个新列来保持 countryenabled 字段的串联,那么您可以使用简单的 whereIn 方法。

id year country enabled country_enabled
0 2000 "France" 0 "France-0"
1 2001 "Spain" 0 "Spain-0"
2 2002 "France" 1 "France-1"
3 2003 "Germany" 1 "Germany-1"
DB::table('countries')->select('id')->whereIn('country_enabled ', ["France-1", "Spain-0"])->get();

您甚至可以向该列添加索引以加快搜索速度。

当然,提供的解决方案会在 table.

中的写作中增加一些开销