🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### [](https://octobercms.com/docs/database/relations#eager-loading)渴望加载 当访问关系作为属性时,关系数据是“延迟加载”的。这意味着直到您首次访问该属性,关系数据才被实际加载。但是,在查询父模型时,模型可以“渴望加载”关系。较早的加载减轻了N + 1查询问题。为了说明N + 1查询问题,请考虑`Book`与以下相关的模型`Author`: ~~~ class Book extends Model { public $belongsTo = [ 'author' => ['Acme\Blog\Models\Author'] ]; } ~~~ 现在,让我们检索所有书籍及其作者: ~~~ $books = Book::all(); foreach ($books as $book) { echo $book->author->name; } ~~~ 此循环将执行1个查询以检索表上的所有书籍,然后对每个书籍执行另一个查询以检索作者。因此,如果我们有25本书,则此循环将运行26个查询:1个查询原始图书,另外25个查询检索每本书的作者。 值得庆幸的是,我们可以使用紧急加载将此操作减少为仅2个查询。查询时,您可以使用以下`with`方法指定应该急切加载的关系: ~~~ $books = Book::with('author')->get(); foreach ($books as $book) { echo $book->author->name; } ~~~ 对于此操作,将仅执行两个查询: ~~~ select * from books select * from authors where id in (1, 2, 3, 4, 5, ...) ~~~ #### 渴望加载多个关系 有时,您可能需要在单个操作中急于加载几个不同的关系。为此,只需将其他参数传递给该`with`方法: ~~~ $books = Book::with('author', 'publisher')->get(); ~~~ #### 嵌套的渴望加载 要渴望加载嵌套关系,可以使用“点”语法。例如,让我们热切地在一个声明中加载本书的所有作者和所有作者的个人联系人: ~~~ $books = Book::with('author.contacts')->get(); ~~~ ### [](https://octobercms.com/docs/database/relations#constraining-eager-loads)限制渴望的负荷 有时您可能希望渴望加载一个关系,但同时为渴望加载查询指定其他查询约束。这是一个例子: ~~~ $users = User::with([ 'posts' => function ($query) { $query->where('title', 'like', '%first%'); } ])->get(); ~~~ 在此示例中,只有帖子的`title`列中包含单词,模型才会渴望加载帖子`first`。当然,您可以调用其他[查询构建器](https://octobercms.com/docs/database/query)方法来进一步自定义急切的加载操作: ~~~ $users = User::with([ 'posts' => function ($query) { $query->orderBy('created_at', 'desc'); } ])->get(); ~~~ ### [](https://octobercms.com/docs/database/relations#lazy-eager-loading)懒惰的渴望加载 有时您可能需要在已检索父模型之后急于加载关系。例如,如果您需要动态决定是否加载相关模型,这可能会很有用: ~~~ $books = Book::all(); if ($someCondition) { $books->load('author', 'publisher'); } ~~~ 如果您需要在预加载查询中设置其他查询约束,则可以将传递`Closure`给`load`方法: ~~~ $books->load([ 'author' => function ($query) { $query->orderBy('published_date', 'asc'); } ]); ~~~