2017-01-12 3 views
2

У меня есть PHP backend, который я сейчас перехожу для использования рамки Laravel. Однако я не совсем уверен, как работает внутреннее соединение Laravel.Laravel Inner Join?

SQL-запрос я пытаюсь перейти к Laravel является:

"SELECT leagues.league_name FROM leagues INNER JOIN countries on leagues.country_id = countries.country_id WHERE countries.country_name = '$country' " 

ли кто-то сможет объяснить, как Laravel присоединяется к работе?

Извинения, если этот вопрос не подходит.

ответ

9

Это должно быть что-то вроде этого (не проверял):

$leagues = DB::table('leagues') 
    ->select('league_name') 
    ->join('countries', 'countries.country_id', '=', 'leagues.country_id') 
    ->where('countries.country_name', $country) 
    ->get(); 

$leagues будет экземпляр Illuminate\Support\Collection объекта, так что вы можете перебирать его с помощью foreach, например.

Вы можете передать 5-й аргумент функции join(), которая укажет тип соединения (по умолчанию - «внутренний»).

Если вы используете красноречивый и есть «Лига» модель, то вы можете использовать объединение по модели тоже:

$leagues = League::select('league_name') 
    ->join('countries', 'countries.country_id', '=', 'leagues.country_id') 
    ->where('countries.country_name', $country) 
    ->get(); 

В этом случае $leagues будет экземпляром Illuminate\Database\Eloquent\Collection, который проходит регулярные коллекции Laravel и дает вам немного больше функциональности, чем обычные коллекции.

Однако, есть еще более простой способ, чтобы написать это без использования объединений:

$leagues = League::select('league_name')->whereHas('countries', function($query) use ($country) { 
    $query->where('country_name', $country); 
})->get(); 

Обратите внимание, что в этом примере «страна» не имя таблицы, но Eloquent relationship name, так что вам нужно настроить свои отношения прежде чем использовать этот подход.

Кроме того, вместо использования соединения этот пример будет использовать два запроса или вложенный запрос, я не уверен; но что-то вроде этого: SELECT league_name FROM leagues WHERE country_id IN (SELECT id FROM countries WHERE country_name='$country')

+0

Приветствую верхнюю часть! – xiimoss

3

Это довольно прямолинейно, возможно, будет иметь смысл просто увидеть ваш запрос, используя построитель запросов.

$results = DB::table('leagues') 
    ->join('countries', 'leagues.country_id', '=', 'countries.country_id') 
    ->where('countries.country_name', $country) 
    ->get(); 
+0

У вас есть ошибка здесь, таблица (в заявлении объединения) не «ведет», а «лиги» :) – Avram

+0

Вау, я исправил ее. – user3158900