首页 > 解决方案 > 即使列值为空也加入多个表

问题描述

我有一个表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 的两个条目。我能做些什么吗?

标签: mysqllaravel

解决方案


where('state.language', '=', 'en')正在删除状态 id 为空的行。如果要保留这些行,则必须添加语言可以为 null 的条件。我不确定你将如何在 Laravel 中实现它,但 SQL 就像:

where (state.language is null or state.language = 'EN')

推荐阅读