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
提出的解决方案来完成
如果您添加一个新列来保持 country
和 enabled
字段的串联,那么您可以使用简单的 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.
中的写作中增加一些开销
我希望在 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
提出的解决方案来完成如果您添加一个新列来保持 country
和 enabled
字段的串联,那么您可以使用简单的 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.
中的写作中增加一些开销