仅当主要关系存在时才急切地加载嵌套关系

时间:2021-03-13 16:00:59

标签: php laravel eloquent laravel-8

我正在尝试从可以有或没有“主要”关系的模型加载嵌套关系。

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

我有一个可选可以具有地址关系的建筑模型。

如果地址关系存在,它总是本身就有一个城市关系。

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

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

问题是这样没有加载 City 嵌套关系,所以我确实尝试了以下操作:

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

这样,对于每个没有与地址相关的模型的建筑物,我都会收到错误消息。

有没有优雅的方法来解决这个问题?

2 个答案:

答案 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