arunfung 4年前

修改理由:

文档没有参照5.8进行翻译

详细描述:

尤其是目录,尽量根据原文来参照翻译,如果修改,尽量多读几遍,是否修改的比之前人家翻译的更恰当。

相关信息:


此投稿已在 4年前 合并。

内容修改:

红色背景 为原始内容

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

OldNewDifferences
1  
21# Eloquent: 关联
32
43- [简介](#introduction)
 
1615   - [多对多](#many-to-many-polymorphic-relations)
1716   - [自定义多态模型](#custom-polymorphic-types)
1817- [查询关联](#querying-relations)
19    - [关联方法 Vs. 动态模型](#relationship-methods-vs-dynamic-properties)
20    - [基于存在的关联关系](#querying-relationship-existence)
21    - [基于不存在的关联关系](#querying-relationship-absence)
22    - [多态关系查询](#querying-polymorphic-relationships)
 18   - [关联方法 Vs. 动态属性](#relationship-methods-vs-dynamic-properties)
 19   - [基于存在的关联查询](#querying-relationship-existence)
 20   - [基于不存在的关联查询](#querying-relationship-absence)
 21   - [多态的关联查询](#querying-polymorphic-relationships)
2322   - [关联数据计数](#counting-related-models)
2423- [预加载](#eager-loading)
25    - [预加载添加约束](#constraining-eager-loads)
 24   - [预加载添加约束](#constraining-eager-loads)
2625   - [延迟预加载](#lazy-eager-loading)
2726- [插入 & 更新关联模型](#inserting-and-updating-related-models)
2827   - [ `save` 方法](#the-save-method)
2928   - [ `create` 方法](#the-create-method)
30    - [更新`belong_to`方法](#updating-belongs-to-relationships)
31    - [更新多对多关联](#updating-many-to-many-relationships)
 29   - [更新 `Belongs To` 关联](#updating-belongs-to-relationships)
 30   - [多对多关联](#updating-many-to-many-relationships)
3231- [更新父集时间戳](#touching-parent-timestamps)
3332
3433<a name="introduction"></a>
3534## 简介
3635
37 数据库表通常相互关联。例如,一篇博客可能有很多条评论,或者一个订单可以关联一个下单用户。Eloquent 使这些管理和协作变得简单,并支持多种不同类型的关联:
38 
 36数据库表通常相互关联。例如,一篇博客文章可能有很多评论,或者一个订单对应一个下单用户。 Eloquent 让这些关联的管理和使用变得简单,并支持多种类型的关联:
 37
 38<div class="content-list" markdown="1">
3939- [一对一](#one-to-one)
4040- [一对多](#one-to-many)
4141- [多对多](#many-to-many)
 
4444- [一对一 (多态关联)](#one-to-one-polymorphic-relations)
4545- [一对多 (多态关联)](#one-to-many-polymorphic-relations)
4646- [多对多 (多态关联)](#many-to-many-polymorphic-relations)
 47</div>  
4748
4849<a name="defining-relationships"></a>
4950## 定义关联
5051
51 Eloquent关联被定义为Eloquent模型类的方法.。如同 Eloquent模型本身 ,关联也可以被作为 [查询构造器](/docs/{{version}}/queries)使用, 并作为方法提供强大的链式调用和查询功能. 例如, 我们可以在` posts` 关联的链式调用中附加一个约束条件:
 52Eloquent 关联在 Eloquent 模型类中以方法的形式呈现。如同 Eloquent 模型本身,关联也可以作为强大的 [查询语句构造器](/docs/{{version}}/queries) 使用,提供了强大的链式调用和查询功能。例如,我们可以在 `posts` 关联的链式调用中附加一个约束条件:
5253
5354   $user->posts()->where('active', 1)->get();
5455
55 不过在深入使用关联之前,让我们先学习如何定义每种关联类型.
 56不过在深入使用关联之前,让我们先学习如何定义每种关联类型
5657
5758<a name="one-to-one"></a>
5859### 一对一
5960
60 『一对一』是最基本的关联关系。例如,一个`User`模型可能关联一个`Phone`模型。为了定义这个关系,我们需要在`User`模型中定义一个`phone`方法。在`phone`方法内部调用`hasOne`方法并返回结果:
 61一对一是最基本的关联关系。例如,一个 `User` 模型可能关联一个 `Phone` 模型。为了定义这个关联,我们要在 `User` 模型中写一个 `phone` 方法。在 `phone` 方法内部调用 `hasOne` 方法并返回其结果:
6162
6263   <?php
6364
 
6869   class User extends Model
6970   {
7071       /**
71         * 获得该用户的电话.
 72        * 获取与用户关联的电话记录。
7273        */
7374       public function phone()
7475       {
 
7677       }
7778   }
7879
79 `hasOne`方法的第一个参数是关联模型的类名。一旦定义了模型关联,我们就可以使用 Eloquent 动态属性获得相关的记录。动态属性允许你访问关系方法就像访问模型中定义的属性一样:
 80
 81`hasOne` 方法的第一个参数是关联模型的类名。一旦定义了模型关联,我们就可以使用 Eloquent 动态属性获得相关的记录。动态属性允许你访问关系方法就像访问模型中定义的属性一样:
8082
8183   $phone = User::find(1)->phone;
8284
83 Eloquent 会基于模型名决定外键名称。在这种情况下,会自动假设 `Phone` 模型有一个 `user_id` 外键。如果你想覆盖这个约定,可以传递第二个参数给 `hasOne `方法:
 85Eloquent 会基于模型名决定外键名称。在这种情况下,会自动假设 `Phone` 模型有一个 `user_id` 外键。如果你想覆盖这个约定,可以传递第二个参数给 `hasOne` 方法:
8486
8587   return $this->hasOne('App\Phone', 'foreign_key');
8688
87 另外,Eloquent 假设外键的值是与父级 `id` (或自定义 $primaryKey) 列的值相匹配的。换句话说,Eloquent 将会在`Phone` 记录的 `user_id` 列中查找与用户表的 `id` 列相匹配的值。如果您希望该关联使用 `id` 以外的自定义键名,则可以给 `hasOne` 方法传递第三个参数:
 89另外,Eloquent 假设外键的值是与父级 `id` (或自定义 `$primaryKey`) 列的值相匹配的。换句话说,Eloquent 将会在 `Phone` 记录的 `user_id` 列中查找与用户表的 `id` 列相匹配的值。如果您希望该关联使用 `id` 以外的自定义键名,则可以给 `hasOne` 方法传递第三个参数:
8890
8991   return $this->hasOne('App\Phone', 'foreign_key', 'local_key');
9092
9193#### 定义反向关联
9294
93 我们已经能从 `User` 模型访问到 `Phone` 模型了。现在,让我们再在 `Phone` 模型上定义一个关联,这个关联能让我们访问到拥有该电话的 `User` 模型。我们可以使用与 `hasOne` 方法对应的 `belongsTo` 方法来定义反向关联:
 95我们已经能从 `User` 模型访问到 `Phone` 模型了。现在,让我们再在 `Phone` 模型上定义一个关联,这个关联能让我们访问到拥有该电话的 `User` 模型。我们可以使用与 `hasOne` 方法对应的 `belongsTo` 方法来定义反向关联:
9496
9597   <?php
9698
 
101103   class Phone extends Model
102104   {
103105       /**
104         * 获得拥有此电话的用户
 106        * 获得拥有此电话的用户
105107        */
106108       public function user()
107109       {
 
109111       }
110112   }
111113
112 在上面的例子中, Eloquent 会尝试匹配 `Phone` 模型上的 `user_id` 至 `User` 模型上的 `id` 。它是通过检查关系方法的名称并使用` _id` 作为后缀名来确定默认外键名称的。但是,如果 `Phone` 模型的外键不是 `user_id `,那么可以将自定义键名作为第二个参数传递给 `belongsTo` 方法:
 114在上面的例子中, Eloquent 会尝试匹配 `Phone` 模型上的 `user_id` 至 `User` 模型上的 `id` 。它是通过检查关系方法的名称并使用 `_id` 作为后缀名来确定默认外键名称的。但是,如果 `Phone` 模型的外键不是 `user_id`,那么可以将自定义键名作为第二个参数传递给 `belongsTo` 方法:
 115
 116   /**
 117    * 获得拥有此电话的用户。
 118    */
 119   public function user()
 120   {
 121       return $this->belongsTo('App\User', 'foreign_key');
 122   }
 123
 124如果父级模型没有使用 `id` 作为主键,或者是希望用不同的字段来连接子级模型,则可以通过给 `belongsTo` 方法传递第三个参数的形式指定父级数据表的自定义键:
113125
114126   /**
115127    * 获得拥有此电话的用户
116128    */
117129   public function user()
118130   {
119        return $this->belongsTo('App\User', 'foreign_key');  
120    }  
121   
122 如果父级模型没有使用 `id` 作为主键,或者是希望用不同的字段来连接子级模型,则可以通过给 `belongsTo` 方法传递第三个参数的形式指定父级数据表的自定义键:  
123   
124    /**  
125     * 获得拥有此电话的用户  
126     */  
127    public function user()  
128    {  
129131       return $this->belongsTo('App\User', 'foreign_key', 'other_key');
130132   }
131133
 
151153       }
152154   }
153155
154 记住一点,Eloquent 将会自动确定 `Comment` 模型的外键属性。按照约定,Eloquent 将会使用所属模型名称的 『snake case』形式,再加上` _id `后缀作为外键字段。因此,在上面这个例子中,Eloquent 将假定 `Comment` 对应到 `Post` 模型上的外键就是 `post_id`。
 156记住一点,Eloquent 将会自动确定 `Comment` 模型的外键属性。按照约定,Eloquent 将会使用所属模型名称的 『snake case』形式,再加上 `_id` 后缀作为外键字段。因此,在上面这个例子中,Eloquent 将假定 `Comment` 对应到 `Post` 模型上的外键就是 `post_id`。
155157
156158一旦关系被定义好以后,就可以通过访问 `Post` 模型的 `comments` 属性来获取评论的集合。记住,由于 Eloquent 提供了『动态属性』 ,所以我们可以像访问模型的属性一样访问关联方法:
157159
 
165167
166168   $comment = App\Post::find(1)->comments()->where('title', 'foo')->first();
167169
168 正如 `hasOne` 方法一样,你也可以在使用` hasMany` 方法的时候,通过传递额外参数来覆盖默认使用的外键与本地键:
 170正如 `hasOne` 方法一样,你也可以在使用 `hasMany` 方法的时候,通过传递额外参数来覆盖默认使用的外键与本地键:
169171
170172   return $this->hasMany('App\Comment', 'foreign_key');
171173
172174   return $this->hasMany('App\Comment', 'foreign_key', 'local_key');
173175
174176<a name="one-to-many-inverse"></a>
175 ### 一对多(反向)
 177### 一对多 (反向)
176178
177179现在,我们已经能获得一篇文章的所有评论,接着再定义一个通过评论获得所属文章的关联关系。这个关联是 `hasMany` 关联的反向关联,需要在子级模型中使用 `belongsTo` 方法定义它:
178180
 
193195       }
194196   }
195197
196 关系定义好以后,我们就可以通过访问 `Comment` 模型的 `post `这个『动态属性』来获取关联的 `Post` 模型了:
 198这个关系定义好以后,我们就可以通过访问 `Comment` 模型的 `post` 这个『动态属性』来获取关联的 `Post` 模型了:
197199
198200   $comment = App\Comment::find(1);
199201
200202   echo $comment->post->title;
201203
202 在上面的例子中,Eloquent 会尝试用 `Comment` 模型的 `post_id` 与 `Post` 模型的` id` 进行匹配。默认外键名是 Eloquent 依据关联名,并在关联名后加上 _ 再加上主键字段名作为后缀确定的。当然,如果 `Comment` 模型的外键不是 `post_id`,那么可以将自定义键名作为第二个参数传递给 `belongsTo` 方法:
 204在上面的例子中,Eloquent 会尝试用 `Comment` 模型的 `post_id` 与 `Post` 模型的 `id` 进行匹配。默认外键名是 Eloquent 依据关联名,并在关联名后加上 `_ `再加上主键字段名作为后缀确定的。当然,如果 `Comment` 模型的外键不是 `post_id`,那么可以将自定义键名作为第二个参数传递给 `belongsTo` 方法:
203205
204206   /**
205207    * 获取此评论所属文章
 
209211       return $this->belongsTo('App\Post', 'foreign_key');
210212   }
211213
212 如果父级模型没有使用 `id` 作为主键,或者希望用不同的字段来连接子级模型,则可以通过给 `belongsTo` 方法传递第三个参数的形式指定父级数据表的自定义键:
 214如果父级模型没有使用 `id` 作为主键,或者希望用不同的字段来连接子级模型,则可以通过给 `belongsTo` 方法传递第三个参数的形式指定父级数据表的自定义键:
213215
214216   /**
215217    * 获取此评论所属文章
 
218220   {
219221       return $this->belongsTo('App\Post', 'foreign_key', 'other_key');
220222   }
221   
222  
223223
224224<a name="many-to-many"></a>
225225### 多对多
 
406406    */
407407   public $incrementing = true;
408408
409 
 409
410410<a name="has-one-through"></a>
411411### 远程一对一关系
412412
 
907907       $query->where('content', 'like', 'foo%');
908908   }, '>=', 10)->get();
909909
910 
 910
911911<a name="querying-relationship-absence"></a>
912912### 查询不存在的关联
913913
 
12031203       ];
12041204   }
12051205
1206 
 1206
12071207
12081208#### 嵌套延迟预加载 & `morphTo`
12091209