Php 基于orWhere语句显示结果

Php 基于orWhere语句显示结果,php,laravel,Php,Laravel,我想知道如何在拉威尔使用orWhere stament。我正在开发一个小应用程序,允许(游戏)部族挑战其他部族,要么直接挑战一个部族,要么挑战另一个部族的比赛 一个氏族可以创建一场比赛,或者当挑战另一个团队时,会自动创建一场比赛,并使用布尔值表示该比赛是一场挑战。挑战另一个氏族的氏族总是“主场球队” 我想显示所有收到的挑战(氏族挑战或比赛挑战以及数量),对于用户所在的所有比赛和氏族。因此,是的,无论是球队还是比赛都可能面临多重挑战 使用下面的代码,我试图从我的数据库中获取当前用户收到的所有挑战,

我想知道如何在拉威尔使用orWhere stament。我正在开发一个小应用程序,允许(游戏)部族挑战其他部族,要么直接挑战一个部族,要么挑战另一个部族的比赛

一个氏族可以创建一场比赛,或者当挑战另一个团队时,会自动创建一场比赛,并使用布尔值表示该比赛是一场挑战。挑战另一个氏族的氏族总是“主场球队”

我想显示所有收到的挑战(氏族挑战或比赛挑战以及数量),对于用户所在的所有比赛和氏族。因此,是的,无论是球队还是比赛都可能面临多重挑战

使用下面的代码,我试图从我的数据库中获取当前用户收到的所有挑战,
$team\u id\u 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();
当一场比赛是挑战赛时,当前用户在“客场球队”,因此是挑战表中的
对手id

当比赛不是挑战赛时,当前用户始终是挑战表中的对手id

我正在使用
havingRaw
仅显示有挑战的匹配项,并且我希望根据
matches.id
对所有内容进行排序。我对orWhere的使用正确吗,因为目前我的虚拟团队收到的挑战没有显示在我的页面上。

在SQL中(例如mySQL)

A和B与C或D和E

将被解释为

(A和B和C)或(D和E)

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

对于
或where
,我强烈建议隔离两个备用子句

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

如果您显示了表模式、小样本数据和所需的结果,那么提供帮助就会容易得多。这样我们就可以把注意力集中在(我想)你正在问的问题上——如何提出正确的问题你为什么需要
或where
子句<代码>匹配。质询可以是
true
false
。如果你问我,你不需要
matches.challenge=true
子句,如果你需要一个orWhere来检查它的
false
,除非它可以为null,并且你有一个where子句,其中
匹配。challenge不是null