php - 根据 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 是否正确,因为目前我的虚拟部落收到的挑战没有显示在我的页面上。
解决方案
在 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();
推荐阅读
- sprite-kit - SpriteKit:从 SKSpriteNode 移除重力不起作用
- string - 如何修复我的程序?计算输入文件中的文章
- android - Cognito 日志 UI 卡在 Kotlin Android 上
- python - 在 Python 中将数字列表转换为包含实际值的字符串
- neo4j - Neo4j 中非常高的查询运行时间
- r - 如何为 r markdown 更改 ANOVA 输出表中的行名?
- ruby-on-rails - 使用 Devise 进行动作电缆测试
- r - R使用带有多列数字和字符串数据的duplicated()来标识不删除
- manjaro - Manjaro 更新后中断:未找到 modules.devname
- css - 反应本机转换起源