Reputation: 407
Mysql Query
LEFT JOIN matches as m
ON sched.league_id = m.leagueid
AND sched.starttime >= m.start_time
AND (sched.team_a_id = m.radiant_team_id AND sched.team_b_id = m.dire_team_id)
OR (sched.team_b_id = m.radiant_team_id AND sched.team_a_id = m.dire_team_id)
Laravel Eloquent
->leftJoin('matches as m', function($join){
$join->on('league_id','=','m.leagueid');
$join->on('starttime','=','m.start_time');
// @TODO AND (sched.team_a_id = m.radiant_team_id AND sched.team_b_id = m.dire_team_id)
// @TODO OR (sched.team_b_id = m.radiant_team_id AND sched.team_a_id = m.dire_team_id)
})
Question
Upvotes: 0
Views: 421
Reputation: 407
$join->on('league_id','=','m.leagueid')
->on('starttime','<=','m.start_time')
->on(DB::raw('m.radiant_team_id'), 'IN', DB::raw('(team_a_id,team_b_id)'))
->on(DB::raw('m.dire_team_id'), 'IN', DB::raw('(team_a_id,team_b_id)'));
Upvotes: 0
Reputation: 81187
Your MySQL query is wrong in the first place, I'm sure this is what you wanted:
LEFT JOIN matches as m
ON sched.league_id = m.leagueid
AND sched.starttime >= m.start_time
AND (
sched.team_a_id = m.radiant_team_id AND sched.team_b_id = m.dire_team_id
OR sched.team_b_id = m.radiant_team_id AND sched.team_a_id = m.dire_team_id
)
Now, unfortunately Laravel is not capable of building this join.
So the only way is this:
->leftJoin('matches as m', function ($j) {
$j->on('league_id','=','m.leagueid')
->on('starttime','=','m.start_time')
->on(sched.team_a_id = m.radiant_team_id)
->on(sched.team_b_id = m.dire_team_id)
->orOn('league_id','=','m.leagueid')
->on('starttime','=','m.start_time')
->on(sched.team_b_id = m.radiant_team_id)
->on(sched.team_a_id = m.dire_team_id);
})
or playing with raw statements (pay attention to parentheses within DB::raw
):
->leftJoin('matches as m', function ($j) {
$j->on('league_id','=','m.leagueid')
->on('starttime','=','m.start_time')
->on(
DB::raw( '(sched.team_a_id',
'=',
DB::raw('m.radiant_team_id AND sched.team_b_id = m.start_time'
.'OR sched.team_b_id = m.radiant_team_id AND sched.team_a_id = m.start_time)')
);
})
Upvotes: 1