cool8jay 4年前

修改理由:

遗漏翻译。

相关信息:


此投稿状态为 标记为已读

内容修改:

红色背景 为原始内容

绿色背景 为新增或者修改的内容

OldNewDifferences
865865
866866echo $posts[0]->pending_comments_count;
867867```
 868  
 869如果你需要同时使用 `select` 和 `withCount` ,一定要确保在 `select` 之后调用 `withCount` :  
 870```  
 871$query = App\Post::select(['title', 'body'])->withCount('comments');  
 872  
 873echo $posts[0]->title;  
 874echo $posts[0]->body;  
 875echo $posts[0]->comments_count;  
 876```  
 877  
868878<a name="eager-loading"></a>
869879## 预加载
870880
871 当通过动态属性的方法去加载关联数据时,它已经是在 「预加载」 了。也就是说,当你在未使用到该关联数据时,它其实是并没有查询数据的。然而, 当你在查询父级模型时, Eloquent 允许渴求式加载关联数据,渴求式加载避免了 N + 1 查询问题。为了说明 N + 1 的查询问题,思考 `Book` 模型关联了 `Auhtor` :
 881当通过动态属性的方法去加载关联数据时,它已经是在 「预加载」 了。也就是说,当你在未使用到该关联数据时,它其实是并没有查询数据的。然而, 当你在查询父级模型时, Eloquent 允许预加载关联数据,预加载避免了 N + 1 查询问题。为了说明 N + 1 的查询问题,思考 `Book` 模型关联了 `Auhtor` :
872882
873883```php
874884<?php
 
889899}
890900```
891901
892 现在,让我读取作者:
 902现在,让我读取作者:
893903
894904```php
895905$books = App\Book::all();
 
899909}
900910```
901911
902 这个循环会执行一条语句去数据库查询所有的书籍,然后为每一本书执行一条语句去获取作者。所以,当我们有 25 本书的时候,这个循环将会产生 26 条语句,一条语句读取所有数据,25 条额外的语句去获取作者。
903 
904 感谢天,感谢地,感谢伟大的渴求加载。我们可以使用渴求式加载把这些操作步骤降低为 2 条查询语句。你可以使用 `with` 方法加载指定的关联数据。
 912这个循环会执行一条语句去数据库查询所有的书籍,然后为每一本书执行一条语句去获取作者。所以,当我们有 25 本书的时候,这个循环将会产生 26 条语句:1条语句读取书籍数据,另外25 条语句获取每本书籍的作者。
 913
 914感谢天,感谢地,感谢伟大的预加载。我们可以使用预加载把这些操作步骤降低为 2 条查询语句。你可以使用 `with` 方法加载指定的关联数据。
905915
906916```php
907917$books = App\Book::with('author')->get();
 
919929select * from authors where id in (1, 2, 3, 4, 5, ...)
920930```
921931
922 #### 多关联关系的渴求式加载
 932#### 多关联关系的加载
923933
924934曾几何时,你也许需要加载一些不同的关联数据在同一次的操作中。如今,你可以使用 `with` 方法,把不同的关联数据当做参数传递即可。如下所示:
925935
 
927937$books = App\Book::with(['author', 'publisher'])->get();
928938```
929939
930 #### 嵌套式的渴求式加载
931 
932 实现渴求式加载也很简单,你可以使用 「.」 点语法去实现。譬如,我们需要加载所有的书籍,并且包含作者以及作者的联系方式。那么我们就可以这样写:
 940#### 嵌套式的加载
 941
 942实现加载也很简单,你可以使用 「.」 点语法去实现。譬如,我们需要加载所有的书籍,并且包含作者以及作者的联系方式。那么我们就可以这样写:
933943
934944```php
935945$books = App\Book::with('author.contacts')->get();
936946```
937947
938 #### 指定特定列的渴求式加载
 948#### 指定特定列的加载
939949
940950也许你需要加载的关联数据的字段并不多。Eloquent 允许你在加载关联数据时指定字段,就像这样:
941951
 
946956> {note} 当你使用这个特性时,你应该永远将 `id` 包含进来。
947957
948958<a name="constraining-eager-loads"></a>
949 ### Constraining Eager Loads
950 
951 有时,你也许希望渴求加载一个关联关系,但是你又希望对关联的数据进行限制,那么你可以这样:
 959### 受限预加载
 960
 961有时,你也许希望加载一个关联关系,但是你又希望对关联的数据进行限制,那么你可以这样:
952962
953963```php
954964$users = App\User::with(['posts' => function ($query) {
 
956966}])->get();
957967```
958968
959 在上面例子中,Eloquent 将加载所有 `title` 列包含 `first` 关键字的文章。除此以外,你还可以使用 [查询构建器]((/docs/{{version}}/queries) 的方法去自定义渴求式加载的操作。
 969在上面例子中,Eloquent 将加载所有 `title` 列包含 `first` 关键字的文章。除此以外,你还可以使用 [查询构建器]((/docs/{{version}}/queries) 的方法去自定义加载的操作。
960970
961971```php
962972$users = App\User::with(['posts' => function ($query) {
 
965975```
966976
967977<a name="lazy-eager-loading"></a>
968 ### 预加载
969 
970 有可能你还希望在模型加载完成后在进行渴求式加载。举例来说,如果你想要动态的加载关联数据,那么 `load` 方法对你来说会非常有用:
 978### 预加载
 979
 980有可能你还希望在模型加载完成后在进行加载。举例来说,如果你想要动态的加载关联数据,那么 `load` 方法对你来说会非常有用:
971981
972982```php
973983$books = App\Book::all();
 
977987}
978988```
979989
980 如果你想要在渴求式加载的查询语句中进行条件约束,你可以通过数组的形式去加载,键为对应的关联关系,值为 `Closure` 闭包函数,该闭包的参数为一个 `query` 实例:
 990如果你想要在加载的查询语句中进行条件约束,你可以通过数组的形式去加载,键为对应的关联关系,值为 `Closure` 闭包函数,该闭包的参数为一个 `query` 实例:
981991
982992```php
983993$books->load(['author' => function ($query) {