一对一关联
一对一关联是最基本的关联关系。主要有以下两种实现方式
- hasOne()
- belongsTo()
1. hasOne()
使用
例如,一个 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
字面意思就是有一个,一个用户有一个手机号(这里不考虑一个用户有多个手机号的情况?)
hasOne
方法的第一个参数是关联模型的类名(这里是 User
模型关联 Phone
模型)。关联关系定义好后,我们就可以使用 Eloquent
动态属性获得相关的记录。您可以像在访问模型中定义的属性一样,使用动态属性:
$phone = User::find(1)->phone;
注意这里的 phone
是没有括号的.不要写成 phone()
Eloquent
会基于父级模型名决定外键名称。在当前场景中,Eloquent
假设 Phone
模型有一个 user_id
外键(这里的 user 就是父级模型 User
),如果外键名不是这个,可以通过给 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');
这里的**父级模型 id
**指的就是 User
模型,当然也很好理解,因为 hasOne()
方法时 User
模型类中的一个方法,User
模型相对于 hasOne()
方法当然就是所谓的父级了.
2. belongsTo()
使用
belongsTo
官方文档把它叫做定义反相关联,其实也很容易 belong to
的英文就是属于的意思,手机号当然是 属于用户的啦。
刚才已经能从 User
模型访问到 Phone
模型了。现在,再在 Phone
模型中定义一个关联,此关联能让我们访问到拥有此电话的 User
模型。这时,使用的是与 hasOne
方法对应的 belongsTo
方法:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Phone extends Model
{
/**
* 获得拥有此电话的用户。
*/
public function user()
{
return $this->belongsTo('App\User');
}
}
在上面的例子中,Eloquent
会尝试匹配 Phone
模型上的 user_id
至 User
模型上的 id
。 它是通过检查关系方法的名称并使用 _id
作为后缀名来确定默认外键名称的。 但是,如果 Phone
模型的外键不是 user_id
,那么可以将自定义键名作为第二个参数传递给 belongsTo
方法:
/**
* 获得拥有此电话的用户。
*/
public function user()
{
return $this->belongsTo('App\User', 'foreign_key');
}
如果父级模型没有使用 id
作为主键,或者是希望用不同的字段来连接子级模型,则可以通过给 belongsTo
方法传递第三个参数的形式指定父级数据表的自定义键:
/**
* 获得拥有此电话的用户。
*/
public function user()
{
return $this->belongsTo('App\User', 'foreign_key', 'other_key');
}
转自
https://laravel-china.org/docs/laravel/5.5/eloquent-relationships/1333