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



我有一个简单的结果表,看起来像下面-

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();

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

'team_id'值为home_team_idaway_team_id

而第二个条件是

mediacolumn is NOT NULL

所以你必须把你的两个条件分解成两个独立的条件语句。

尝试以下查询

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

你能试试这个吗?

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

这是初学者常犯的错误。

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

https://laravel.com/docs/8.x/queries逻辑分组

相关内容

  • 没有找到相关文章

最新更新