【问题标题】:Laravel QueryBuilder multiple columns match in the same WhereInLaravel Query Builder 多列在同一个 WhereIn 中匹配
【发布时间】:2021-04-18 06:57:43
【问题描述】:

我希望在 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));

这将返回 1 和 2。

Eloquent 可以做到这一点(如此处建议的那样:laravel whereIn multiple columns,但它不会返回预期的结果:

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

这将返回 0、1 和 2。

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

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

有人有想法吗?

【问题讨论】:

    标签: laravel laravel-query-builder


    【解决方案1】:

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

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

    该代码返回组合法国 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一起工作

    【讨论】:

    • 我同意这将与我正在寻找的内容相匹配,但我实际上是在尝试绑定数千条记录的大量 upsert 的 id。我倾向于认为同一个 whereIn 中的多个列会更优化 SQL,并且真的很想用这种语法来做到这一点。但我认为你的解决方案比我目前的原始查询更好,即使它只是为了安全。感谢您的回复!
    【解决方案2】:

    你想得到的查询语法:

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

    是 Oracle 独有的。 Laravel 的 whereIn 方法支持 (String, Array),所以我认为您只能通过原始查询或使用V-K 提出的解决方案来完成此操作@

    【讨论】:

    • 如果我没记错的话,Oracle 是 MySql,我使用的引擎是 MariaDb(我仔细检查过),它可以工作。但我想,由于 MariaDb 是 MySql 的一个分支,它们共享很多特性。无论如何,如果它只被这两个引擎支持,那么 Laravel Querybuilder 并不觉得它必须支持它是有道理的,因为这种行为可以通过@V-K 答案来模拟。感谢您的宝贵时间。
    猜你喜欢
    • 2019-11-06
    • 2021-08-19
    • 2018-09-13
    • 1970-01-01
    • 2017-12-07
    • 2015-08-22
    • 2017-03-14
    • 2016-04-10
    • 1970-01-01
    相关资源
    最近更新 更多