在 Laravel 中加载所有关系和他们的孩子

far*_*jam 2 laravel laravel-5.1

我有一个相当复杂的结构,其中包含多个关系。如果我的关系是这样定义的,我如何在一次调用中加载所有这些关系?

Model
    (has many) ChildModels1
        Child1a
        Child1b
        ...
    (has many) ChildModels2
        Child2a
        Child2b
        ...
    (has many) ChildModels3
        Child3a
        Child3a
            Child3aa
            Child3ab
            ...
Run Code Online (Sandbox Code Playgroud)

我能够执行以下操作:

$entity = Entity::find($id)->load('ChildModels1', 'ChildModels2', 'ChildModels3');
Run Code Online (Sandbox Code Playgroud)

但我也不确定如何加载所有的子关系。

Ale*_*ris 9

这可以通过 Eager Loading 实现:

Entity::where('id', $id)->with('relation1.subrelation1', 'relation1.subrelation2', 'relation2.subrelation1', 'relation2.subrelation2')->get();
Run Code Online (Sandbox Code Playgroud)

当访问 Eloquent 关系作为属性时,关系数据是“延迟加载”的。这意味着在您第一次访问该属性之前不会实际加载关系数据。但是,Eloquent 可以在您查询父模型时“急切加载”关系。Eager loading 缓解了 N+1 查询问题。

你可以在关于预先加载的 Laravel文档中阅读更多相关信息。