获取预先加载的对象的属性,而无需再次运行查询

时间:2016-01-31 11:47:32

标签: php laravel

我正在运行此查询:

Music::where('title', $title)->with(['artists.images'])->get();

结果,我有一个音乐列表

array:4 [▼
    0 => Music {#276 ▶}
    1 => Music {#275 ▶}
    2 => Music {#274 ▶}
    3 => Music {#273 ▶}
]

每首音乐都与艺术家有关(例如由3位艺术家演唱的音乐)

// Music #1
...
relations: array:1 [▼
    "artists" => Collection {#269 ▼
        items: array:3 [▶]
    }
]
...

每个艺术家都与图像有关系(艺术家有7个图像)

// Artist #1 of Music #1
...
relations: array:2 [▼
    "pivot" => Pivot {#329 ▶}
    "images" => Collection {#505 ▼
        items: array:7 [▶]
    }
]
...

一切都很好。

但是在我的视图文件中,当我这样做时(在foreach循环中)

@foreach($music->artists()->where('type', 'feature')->get() as $feature)
    {{ $feature->name }}
@endforeach

它再次运行许多查询来实现此目的。 $music->artists应该已经急切加载,因此不必再次运行查询。当我在其上运行dd()时,它实际上包含了上面提到的关系。

如何在不再次运行这些查询的情况下简单地获取属性?

1 个答案:

答案 0 :(得分:0)

渴望加载关系可以像这样完成

@foreach($music->with(['artists.images'] )->artists()->where('type', 'feature')->get() as $feature)
{{ $feature->name }}
@endforeach

如果这不起作用,那么用像...这样的过滤器替换你的位置。

@foreach($music->with(['artists.images'] )->artists->filter(function($it){return $it->type===' feature'} ) as $feature)
{{ $feature->name }}
@endforeach