Php 仅当主关系存在时才加载嵌套关系

Php 仅当主关系存在时才加载嵌套关系,php,laravel,eloquent,laravel-8,Php,Laravel,Eloquent,Laravel 8,我试图从一个模型中加载一个嵌套的不动产关系,这个模型可以有也可以没有“主”关系 我有3个模型:建筑、地址和城市 我有一个建筑模型,可以有地址关系 如果地址关系存在,则始终具有城市关系本身 我的“列出建筑物”控制器功能如下所示: $buildingList = Building::with(['address','type'])->get(); 问题在于,城市嵌套关系不会以这种方式加载,因此我尝试了以下方法: $buildingList = Building::with(['address

我试图从一个模型中加载一个嵌套的不动产关系,这个模型可以有也可以没有“主”关系

我有3个模型:建筑、地址和城市

我有一个建筑模型,可以有地址关系

如果地址关系存在,则始终具有城市关系本身

我的“列出建筑物”控制器功能如下所示:

$buildingList = Building::with(['address','type'])->get();
问题在于,城市嵌套关系不会以这种方式加载,因此我尝试了以下方法:

$buildingList = Building::with(['address.city','type'])->get();
这样,对于没有地址相关模型的每个建筑,我都会得到一个错误


有没有一种优雅的方法可以解决这个问题?

您可以在建筑模型中获得城市(不要忘记在地址模型中创建关系)

然后,您的第一个查询将运行并加载城市

$buildingList = Building::with(['address','type'])->get();
要显示城市名称,请执行以下操作:

{{ $building->address->city->name }}

更多关于问题原因的信息:

您最有可能使用以下内容:

{{ $building->address->city->name }}
这将导致您描述的问题。Php将出错,因为它找不到您要查找的变量

最简单的解决办法是:

{{ $building->address->city->name ?? 'No address data' }}
现在,如果找不到地址,将显示“无地址数据”值。如果你的船漂浮在水面上,你也可以留下一根空绳子

现在,您可以使用以下代码加载它:

$buildingList = Building::with(['address.city','type'])->get();

你可以阅读更多关于??也称为“空合并运算符”

您是否在地址模型上定义了
city
$buildingList = Building::with(['address.city','type'])->get();