Eloquent: 关联模型
简介
数据库中的表经常性的关联其它的表。比如,一个博客文章可以有很多的评论,或者一个订单会关联一个用户。Eloquent 使管理和协作这些关系变的非常的容易,并且支持多种不同类型的关联:
一对一
一对多
多对多
远程一对多
多态关联
多态多对多关联
定义关联
Eloquent 关联可以像定义方法一样在 Eloquent 模型类中进行定义。同时,它就像 Eloquent 模型自身一样也提供了强大的查询生成器。这允许关联模型可以链式的执行查询能力。比如:
$user->posts()->where('active', 1)->get();
但是,在更深入的使用关联之前,让我们先来学习一下如何定义各种类型的关联。
一对一
一对一的关联是最基础的关联。比如,一个 User
模型可能关联一个 Phone
。我们需要在 User
模型上放置一个 phone
方法来定义这种关联。phone
方法应该返回一个基类 Eloquent 模型上 hasOne
方法的结果:
<?phpnamespace App;use Illuminate/Database/Eloquent/Model;class User extends Model{ /** * Get the phone record associated with the user. */ public function phone() { return $this->hasOne('App/Phone'); }}
传递到 hasOne
方法的第一个参数应该是关联模型的名称。一旦关联被定义完成,我们可以使用 Eloquent 的动态属性来访问关联模型的记录。动态属性允许你访问关联函数,就像是它们是定义在模型中的属性一样:
$phone = User::find(1)->phone;
Eloquent 假定所关联的外键是基于模型的名称的。在这个前提下,Phone
模型会自动的假定其拥有一个 user_id
外键。如果你希望修改这个惯例,你可以传递第二个参数到 hasOne
方法中:
return $this->hasOne('App/Phone', 'foreign_key');
另外,Eloquent 也会假定外键应该在其上层模型上拥有一个匹配的 id
(或者自定义的 $primaryKey
)值。换句话说,Eloquent 会查询 Phone
记录中的 user_id
列所对应的用户的 id
列的记录。如果你希望关联使用 id
以外的值,你可以传递第三个参数到 hasOne
方法来指定自定义的键:
return $this->hasOne('App/Phone', 'foreign_key', 'local_key');
定义相对的关联
那么,我们可以从我们的 User
中访问
新闻热点
疑难解答