遗漏翻译。
修改理由:
相关信息:
- 类型:文档文章
- 文章: 模型关联
- 文档: 《Laravel 5.7 中文文档(5.7)》
此投稿已在 6年前 合并。
内容修改:
| Old | New | Differences |
|---|---|---|
| 865 | 865 | |
| 866 | 866 | echo $posts[0]->pending_comments_count; |
| 867 | 867 | ``` |
| 868 | ||
| 869 | 如果你需要同时使用 `select` 和 `withCount` ,一定要确保在 `select` 之后调用 `withCount` : | |
| 870 | ``` | |
| 871 | $query = App\Post::select(['title', 'body'])->withCount('comments'); | |
| 872 | ||
| 873 | echo $posts[0]->title; | |
| 874 | echo $posts[0]->body; | |
| 875 | echo $posts[0]->comments_count; | |
| 876 | ``` | |
| 877 | ||
| 868 | 878 | <a name="eager-loading"></a> |
| 869 | 879 | ## 预加载 |
| 870 | 880 | |
| 871 | 当通过动态属性的方法去加载关联数据时,它已经是在 「预加载」 了。也就是说,当你在未使用到该关联数据时,它其实是并没有查询数据的。然而, 当你在查询父级模型时, Eloquent 允许 | |
| 881 | 当通过动态属性的方法去加载关联数据时,它已经是在 「预加载」 了。也就是说,当你在未使用到该关联数据时,它其实是并没有查询数据的。然而, 当你在查询父级模型时, Eloquent 允许预加载关联数据,预加载避免了 N + 1 查询问题。为了说明 N + 1 的查询问题,思考 `Book` 模型关联了 `Auhtor` : | |
| 872 | 882 | |
| 873 | 883 | ```php |
| 874 | 884 | <?php | … | … |
| 889 | 899 | } |
| 890 | 900 | ``` |
| 891 | 901 | |
| 892 | 现在,让我 | |
| 902 | 现在,让我们读取作者: | |
| 893 | 903 | |
| 894 | 904 | ```php |
| 895 | 905 | $books = App\Book::all(); | … | … |
| 899 | 909 | } |
| 900 | 910 | ``` |
| 901 | 911 | |
| 902 | 这个循环会执行一条语句去数据库查询所有的书籍,然后为每一本书执行一条语句去获取作者。所以,当我们有 25 本书的时候,这个循环将会产生 26 条语句 | |
| 903 |
| |
| 904 | 感谢天,感谢地,感谢伟大的 | |
| 912 | 这个循环会执行一条语句去数据库查询所有的书籍,然后为每一本书执行一条语句去获取作者。所以,当我们有 25 本书的时候,这个循环将会产生 26 条语句:1条语句读取书籍数据,另外25 条语句获取每本书籍的作者。 | |
| 913 | ||
| 914 | 感谢天,感谢地,感谢伟大的预加载。我们可以使用预加载把这些操作步骤降低为 2 条查询语句。你可以使用 `with` 方法加载指定的关联数据。 | |
| 905 | 915 | |
| 906 | 916 | ```php |
| 907 | 917 | $books = App\Book::with('author')->get(); | … | … |
| 919 | 929 | select * from authors where id in (1, 2, 3, 4, 5, ...) |
| 920 | 930 | ``` |
| 921 | 931 | |
| 922 | #### 多关联关系的 | |
| 932 | #### 多关联关系的预加载 | |
| 923 | 933 | |
| 924 | 934 | 曾几何时,你也许需要加载一些不同的关联数据在同一次的操作中。如今,你可以使用 `with` 方法,把不同的关联数据当做参数传递即可。如下所示: |
| 925 | 935 | … | … |
| 927 | 937 | $books = App\Book::with(['author', 'publisher'])->get(); |
| 928 | 938 | ``` |
| 929 | 939 | |
| 930 | #### 嵌套式的 | |
| 931 |
| |
| 932 | 实现 | |
| 940 | #### 嵌套式的预加载 | |
| 941 | ||
| 942 | 实现预加载也很简单,你可以使用 「.」 点语法去实现。譬如,我们需要加载所有的书籍,并且包含作者以及作者的联系方式。那么我们就可以这样写: | |
| 933 | 943 | |
| 934 | 944 | ```php |
| 935 | 945 | $books = App\Book::with('author.contacts')->get(); |
| 936 | 946 | ``` |
| 937 | 947 | |
| 938 | #### 指定特定列的 | |
| 948 | #### 指定特定列的预加载 | |
| 939 | 949 | |
| 940 | 950 | 也许你需要加载的关联数据的字段并不多。Eloquent 允许你在加载关联数据时指定字段,就像这样: |
| 941 | 951 | … | … |
| 946 | 956 | > {note} 当你使用这个特性时,你应该永远将 `id` 包含进来。 |
| 947 | 957 | |
| 948 | 958 | <a name="constraining-eager-loads"></a> |
| 949 | ### | |
| 950 |
| |
| 951 | 有时,你也许希望 | |
| 959 | ### 为预加载添加约束条件 | |
| 960 | ||
| 961 | 有时,你也许希望预加载一个关联关系,但是你又希望对关联的数据进行限制,那么你可以这样: | |
| 952 | 962 | |
| 953 | 963 | ```php |
| 954 | 964 | $users = App\User::with(['posts' => function ($query) { | … | … |
| 956 | 966 | }])->get(); |
| 957 | 967 | ``` |
| 958 | 968 | |
| 959 | 在上面例子中,Eloquent 将加载所有 `title` 列包含 `first` 关键字的文章。除此以外,你还可以使用 [查询构建器]((/docs/{{version}}/queries) 的方法去自定义 | |
| 969 | 在上面例子中,Eloquent 将加载所有 `title` 列包含 `first` 关键字的文章。除此以外,你还可以使用 [查询构建器]((/docs/{{version}}/queries) 的方法去自定义预加载的操作。 | |
| 960 | 970 | |
| 961 | 971 | ```php |
| 962 | 972 | $users = App\User::with(['posts' => function ($query) { | … | … |
| 965 | 975 | ``` |
| 966 | 976 | |
| 967 | 977 | <a name="lazy-eager-loading"></a> |
| 968 | ### | |
| 969 |
| |
| 970 | 有可能你还希望在模型加载完成后在进行 | |
| 978 | ### 延迟预加载 | |
| 979 | ||
| 980 | 有可能你还希望在模型加载完成后在进行预加载。举例来说,如果你想要动态的加载关联数据,那么 `load` 方法对你来说会非常有用: | |
| 971 | 981 | |
| 972 | 982 | ```php |
| 973 | 983 | $books = App\Book::all(); | … | … |
| 977 | 987 | } |
| 978 | 988 | ``` |
| 979 | 989 | |
| 980 | 如果你想要在 | |
| 990 | 如果你想要在预加载的查询语句中进行条件约束,你可以通过数组的形式去加载,键为对应的关联关系,值为 `Closure` 闭包函数,该闭包的参数为一个 `query` 实例: | |
| 981 | 991 | |
| 982 | 992 | ```php |
| 983 | 993 | $books->load(['author' => function ($query) { |
关于 LearnKu