如何包装 Laravel 雄辩的条件来创建以下查询

Posted

技术标签:

【中文标题】如何包装 Laravel 雄辩的条件来创建以下查询【英文标题】:How do I wrap Laravel eloquent conditions to create the following query 【发布时间】:2021-12-09 16:12:28 【问题描述】:

我有一个简单的结果表,如下所示 -

id, home_team_id, away_team_id, home_score, away_score, media
1       511          322            4           0       'a4vw'
2       232          511            2           2       'bf34',
3       111          511            2           3        NULL        

我能够获取“team_id”值为home_team_idaway_team_id = 511 的所有行,但我还需要检查以确保media 列是NOT NULL 原始 SQL 查询应该是这样的

SELECT * FROM results where (home_team_id = 310718 OR away_team_id = 310718) and media is not null;

但是,我正在尝试尽可能多地使用 Laravel Eloquent 方法,因为我正在学习这一点,因此可以使用如下的一种方法(效果很好),但我试图不使用任何 DB::raw 方法我的方法

DB::table("results")
->where(DB::raw("(home_team_id = 511 or away_team_id = 511)"))
->whereNotNull("media")
->get();

如何在我的结果模型中修改以下内容以执行与上述查询相同的查询,因为这会返回所有结果,我只期望 2 个结果,因为媒体列有一个 NULL 条目

return Result::where('home_team_id', '=', $clubId)
             ->orWhere('away_team_id', '=', $clubId)
             ->whereNotNull('media')
             ->get();

【问题讨论】:

【参考方案1】:

您的查询中的问题是在错误的位置使用了orWhere 条件。由于您的查询中有两个主要条件,一个是

'team_id' 值是 home_team_idaway_team_id

而第二个条件是

media 列不为空

因此,您必须将两个条件分解为两个单独的条件语句。

试试下面的查询

return Result::where(function($query) use ($clubId) 
   $query->where('home_team_id', '=', $clubId)
         ->orWhere('away_team_id', '=', $clubId);
)
->whereNotNull('media')
->get();

【讨论】:

【参考方案2】:

你能试试这个吗?

return Result::where(function($query) use ($clubId) 
            $query->where('home_team_id', $clubId)
                ->orWhere('away_team_id', $clubId);
        )->whereNotNull('media')->get();

【讨论】:

【参考方案3】:

这是初学者的常见错误。

您应该始终对orWhere 调用进行分组,以避免在应用全局范围时出现意外行为。

https://laravel.com/docs/8.x/queries#logical-grouping

【讨论】:

以上是关于如何包装 Laravel 雄辩的条件来创建以下查询的主要内容,如果未能解决你的问题,请参考以下文章

用于 maria-db 动态列的 Laravel 雄辩包装器

Laravel 雄辩的 SQL 查询与 OR 和 AND 与 where 子句

laravel 雄辩的数据透视表查询“不明确的列名”

如何在 Laravel 雄辩关系中添加多个条件

Laravel 通过属性获得雄辩的查询构建器关系

Laravel:如何设置带有条件的自定义列?