Eloquent:关联
简介
数据库表通常相互关联。 例如,一篇博客文章可能有许多评论,或者一个订单对应一个下单用户。Eloquent 让这些关联的管理和使用变得简单,并支持多种类型的关联:
定义关联
Eloquent 关联在 Eloquent 模型类中以方法的形式呈现。如同 Eloquent 模型本身,关联也可以作为强大的 查询语句构造器 使用,提供了强大的链式调用和查询功能。例如,我们可以在 posts
关联的链式调用中附加一个约束条件:
$user->posts()->where('active', 1)->get();
不过,在深入使用关联之前,让我们先学习如何定义每种关联类型。
一对一
一对一关联是最基本的关联关系。例如,一个 User
模型可能关联一个 Phone
模型。为了定义这个关联,我们要在 User
模型中写一个 phone
方法,在phone
方法内部调用 hasOne
方法并返回其结果:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* 获得与用户关联的电话记录。
*/
public function phone()
{
return $this->hasOne('App\Phone');
}
}
hasOne
方法的第一个参数是关联模型的类名。关联关系定义好后,我们就可以使用 Eloquent 动态属性获得相关的记录。您可以像在访问模型中定义的属性一样,使用动态属性:
$phone = User::find(1)->phone;
Eloquent 会基于模型名决定外键名称。在当前场景中,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');