Красноречивый запрос Laravel, имеющий JOIN и подзапрос - PullRequest
0 голосов
/ 15 июня 2019

Мне нужно использовать запрос в Laravel eloquent ( построитель запросов ), но я не уверен, как его преобразовать:

SELECT c.*, m.*,th.team as team_home, ta.team as team_away from schedule as c

LEFT JOIN matches as m ON m.id_match = c.match_id
LEFT JOIN teams as  th ON m.team_h = th.id_team
LEFT JOIN teams as  ta ON m.team_a = ta.id_team

WHERE c.serie_id = :sid and c.days =(

   SELECT c.days from schedule as c
   LEFT JOIN matches as m ON m.id_match = c.match_id
   WHERE c.serie_id = :sid and m.match_stato = 2 order by c.days DESC LIMIT 1

) order by c.days, th.team ASC

Как вы заметили, у него есть 3 СОЕДИНЕНИЯ и подзапрос, чем два заказа. Как я могу использовать его в Eloquent?

Ответы [ 2 ]

1 голос
/ 15 июня 2019

Вот и мы. Дважды проверьте любые ошибки или логику, так как это был довольно запутанный запрос. Но я надеюсь, что это даст вам указатели в правильном направлении

DB::query()
   ->select(['c.*', 'm.*','th.team as team_home', 'ta.team as team_away'])
   ->from('schedules AS c')
   ->leftJoin('matches AS m', 'm.id_match', '=', 'c.match_id')
   ->leftJoin('teams AS th', 'm.team_h', '=', 'th.id_team')
   ->leftJoin('teams AS ta', 'm.team_a', '=', 'ta.id_team')

   ->where('c.serie_id','=',':sid')
   ->whereIn('c.days', function($q) {
       $q->select('c.days')
         ->from('schedule AS c')
         ->leftJoin('matches AS m', 'm.id_match', '=', 'c.match_id')
          ->where('c.serie_id','=',':sid')
          ->where('m.match_stato','=',2)
          ->orderBy('c.days','DESC')
          ->limit(1);
     })

    ->orderBy('c.days')
    ->get()
1 голос
/ 15 июня 2019

Для подзапросов такого рода вы можете использовать whereIn().

Кроме того, для логики внутри подзапроса вместо order by c.days DESC LIMIT 1 вы можете просто использовать max(c.days) в предложении select.

DB::table('schedule as c')
    ->join('matches as m', 'm.id_match', '=', 'c.match_id')
    ->join('teams as th', 'm.team_h', '=', 'th.id_team')
    ->join('teams as ta', 'm.team_a', '=', 'ta.id_team')

    ->where('c.serie_id', '=', $sid)
    ->whereIn('c.days', function($query) use($sid){
        $query->select('max(c.days)')
            ->from('schedule as c2')
            ->join('matches as m2', 'm2.id_match', '=', 'c2.match_id')
            ->where('c2.serie_id', '=', $sid)
            ->where('m2.match_stato', '=', 2);
    }) 
    ->select('c.*', 'm.*', 'th.team as team_home', 'ta.team as team_away')

    ->orderBy('c.days', 'asc')
    ->orderBy('th.team', 'asc')
    ->get();      

######
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...