遗漏翻译。
cool8jay
5年前
修改理由:
相关信息:
- 类型:文档文章
- 文章: 模型关联
- 文档: 《Laravel 5.7 中文文档(5.7)》
此投稿已在 5年前 合并。
内容修改:
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) { |