我正在尝试从可以有或没有“主要”关系的模型加载嵌套关系。
我有 3 个模型:建筑物、地址和城市。
我有一个可选可以具有地址关系的建筑模型。
如果地址关系存在,它总是本身就有一个城市关系。
我的“列出建筑物”控制器功能如下所示:
$buildingList = Building::with(['address','type'])->get();
问题是这样没有加载 City 嵌套关系,所以我确实尝试了以下操作:
$buildingList = Building::with(['address.city','type'])->get();
这样,对于每个没有与地址相关的模型的建筑物,我都会收到错误消息。
有没有优雅的方法来解决这个问题?
答案 0 :(得分:1)
您可以在建筑模型中获取城市(不要忘记在地址模型中创建关系)
public function address()
{
return $this->hasOne(Address:class)->with('city');
}
然后你的第一个查询应该可以工作并加载城市。
$buildingList = Building::with(['address','type'])->get();
显示城市名称:
{{ $building->address->city->name }}
答案 1 :(得分:0)
更多地解决问题的原因:
您很可能正在使用这样的东西:
{{ $building->address->city->name }}
这将导致您描述的问题。 Php 会出错,因为它找不到您要查找的变量。
最简单的解决方案是:
{{ $building->address->city->name ?? 'No address data' }}
如果找不到地址,现在将显示值“无地址数据”。如果它漂浮在您的船上,您也可以将其保留为空字符串。
现在你可以用代码加载它:
$buildingList = Building::with(['address.city','type'])->get();
您可以阅读更多关于 ??也称为“空合并运算符”here