一对一关联是最基本的关联关系。主要有以下两种实现方式
hasOne()
使用例如,一个 User
模型可能关联一个 Phone
模型。为了定义这个关联,我们要在 User
模型中写一个 phone
方法,在 phone
方法内部调用 hasOne
方法并返回其结果:
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()
方法当然就是所谓的父级了.
belongsTo()
使用belongsTo
官方文档把它叫做定义反相关联,其实也很容易 belong to
的英文就是属于的意思,手机号当然是 属于用户的啦。
刚才已经能从 User
模型访问到 Phone
模型了。现在,再在 Phone
模型中定义一个关联,此关联能让我们访问到拥有此电话的 User
模型。这时,使用的是与 hasOne
方法对应的 belongsTo
方法:
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