首页 > 解决方案 > 根据 orWhere 语句显示结果

问题描述

我试图弄清楚如何在 laravel 中使用 orWhere 语句。我正在构建一个小应用程序,允许(游戏)氏族挑战其他氏族,要么直接挑战一个氏族,要么挑战另一个氏族放置的比赛。

一个战队可以创建一场比赛,或者在挑战另一支球队时,会自动创建一场比赛,并带有一个表示该比赛是一场挑战的布尔值。一个战队挑战另一个战队,永远是“主场球队”。

我想为用户所在的所有比赛和部落显示所有收到的挑战(部落挑战或比赛挑战以及数量)。所以是的,团队和比赛都可以有多个挑战。

使用以下代码,我试图从我的数据库中为当前用户获取所有收到的挑战,并$team_id_arr包含一个包含用户所有团队 ID 的数组。

$receivedChallenges = DB::table('challenges')
->select(
    'matches.id as id',
    'matches.date as date',
    'matches.time as time',
    'challenges.id as challenge_id',
    DB::raw('count(challenges.id) as challenge_amount')
)
->leftjoin('matches', 'matches.id', '=', 'challenges.match_id')
->leftjoin('team_user as ht', 'ht.team_id', '=', 'matches.home_id')
->leftjoin('team_user as at', 'at.team_id', '=', 'matches.away_id')
->where('matches.played', '=', false)
->where('matches.planned', '=', false)
->where(function($query) use ($team_id_arr) {
    $query
    ->where('matches.challenge', '=', true)
    ->where('at.user_id', '=', auth()->user()->id)
    ->where('challenges.opponent_id', 'matches.away_id')

    // Or where...
    ->orWhere('matches.challenge', '=', false)
    ->where('challenges.opponent_id', $team_id_arr);
})
->havingRaw('count(challenges.id) > ?', [0])
->groupBy('matches.id')
->get();

当比赛是挑战时,当前用户在“客队”中,因此opponent_id在挑战表中。

当比赛不是挑战时,当前用户始终是填写opponent_id挑战表的氏族。

我正在使用havingRaw仅显示有挑战的比赛,并且我想根据matches.id. 我使用 orWhere 是否正确,因为目前我的虚拟部落收到的挑战没有显示在我的页面上。

标签: phplaravel

解决方案


在 SQL(例如 mySQL)中,

A AND B AND C OR D AND E

将被解释为

(A AND B AND C) OR (D AND E).

但是由于 Eloquent 允许以任何顺序使用命令构造查询,因此必须对 SQL 中的一些实践进行不同的翻译。

在 的情况下orWhere,我强烈建议隔离两个备用子句。

$receivedChallenges = DB::table('challenges')
->select(
    'matches.id as id',
    'matches.date as date',
    'matches.time as time',
    'challenges.id as challenge_id',
    DB::raw('count(challenges.id) as challenge_amount')
)
->leftjoin('matches', 'matches.id', '=', 'challenges.match_id')
->leftjoin('team_user as ht', 'ht.team_id', '=', 'matches.home_id')
->leftjoin('team_user as at', 'at.team_id', '=', 'matches.away_id')
->where('matches.played', '=', false)
->where('matches.planned', '=', false)
->where(function($query) use ($team_id_arr) {
    $query->where(function($query){
        $query
        ->where('matches.challenge', '=', true)
        ->where('at.user_id', '=', auth()->user()->id)
        ->where('challenges.opponent_id', 'matches.away_id')
    })->orWhere(function($query) use($team_id_arr){
        $query
        ->where('matches.challenge', '=', false)
        ->where('challenges.opponent_id', $team_id_arr);
    });
})
->havingRaw('count(challenges.id) > ?', [0])
->groupBy('matches.id')
->get();

推荐阅读