#mysql #laravel
#mysql #laravel
Вопрос:
У меня есть таблица Users
, в которой есть внешние ключи для 3 других таблиц (в таблице есть 10 других столбцов, но они не имеют значения)
ID CityId CountryID StateId
1 1 2 null
2 4 2 null
3 54 3 1
Теперь мне нужно объединить таблицы городов, стран и штатов по их уважаемым ids
. Все 3 таблицы следуют приведенному ниже шаблону [ID/Name/Language/ColumnNameID]
Таблица городов:
ID Name CityId Language
1 Budapest 1 En
2 Paris 15 En
3 Berlin 54 En
4 Szeged 4 En
Таблица стран:
ID Name CountryId Language
1 Hungary 2 En
2 Germany 3 En
Таблица состояний:
ID Name StateId Language
1 Berlin 1 En
И вот запрос для leftJoin
всех трех таблиц в таблицу Users:
$results = DB::table('users')
->leftJoin('city', 'users.city_id', '=', 'city.city_id')
->where('city.language', '=', 'en')
->leftJoin('country', 'users.country_id', '=', 'country.country_id')
->where('country.language', '=', 'en')
->leftJoin('state', 'users.state_id', '=', 'state.state_id')
->where('state.language', '=', 'en')
->select('country.id', 'users.first_name', 'users.last_name', 'country.name as country_name', 'city.name as city_name', 'state.name as state_name')
->get();
Работает, но я не получаю результатов, где в users
таблице под state id
столбцом указаны значения null
. Вот как это выглядит:
Id First_Name Last_Name City_Name Country_Name State_Name
2 XXX XXX Berlin Germany Berlin
Две записи, которые имеют StateID = null, отсутствуют. Что я могу с этим поделать?
Комментарии:
1. Переместите условие из WHERE в ON (в условие для LEFT JOIN). В SQL это выглядит так
FROM users LEFT JOIN city ON (users.city_id = city.city_id AND city.language = 'en') LEFT JOIN country ...
.
Ответ №1:
Отбрасываются строки, в которых идентификатор состояния равен нулю. where('state.language', '=', 'en')
Вы должны добавить условие, что язык может быть нулевым, если вы хотите сохранить эти строки. Я не уверен, как вы могли бы реализовать это в Laravel, но SQL будет выглядеть так:
where (state.language is null or state.language = 'EN')