2014-11-29 6 views
0

MySQL QueryLaravel 4,2 Eloquent отношения LeftJoin на сложные

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 красноречивый

->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) 
    }) 

Вопрос

  • Как налево присоединиться на (что-то = что-то и что-то = что-то) или (что-то = что-то и что-то = что-то) используя Laravel красноречивый

ответ

0
   $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)')); 
1

Ваш запрос MySQL неправильно, в первую очередь, я уверен, что это то, что вы хотели :

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 не в состоянии построить это соединение.

Таким образом, единственный способ заключается в следующем:

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

или играть с сырыми отчетности (обратите внимание на круглые скобки в 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)') 
    ); 
}) 
+0

Ваш айте шафером! : D, пожалуйста, дайте мне знать, обновил ли laravel это: D – ronscript

+0

Текущий dev-master не дает никаких изменений, не стесняйтесь создавать PR :) –

Смежные вопросы