模型hasOne、hasMany、belongsTo详解

发布 : 2019-06-29 分类 : 后端 浏览 :

ThinkPHP5有关联模型的操作,但有部分初学者对数据表中常见的几种表与表的关系还存在着问题,所以使用不好关联查询。

这里将 hasOne、hasMany、belongsTo 进行一个详细举例说明。

首先,这3个的大致中文意思:

hasOne:有一个,加上主谓语应该是 ,A 有一个 B
hasMany:有很多,A 有很多 B
belongsTo:属于, A 属于 B

这里我们准备3张表来理解他们的关系:

user_group 用户分组表:id title

user 用户表:id user_group_id username password

profile 用户信息表:id user_id nickname sex

  1. user表需要关联user_group表,表示每一个 用户 需要知道该用户是 哪个用户分组的;

  2. profile表 需要关联 用户表,表示该用户信息数据 是哪个用户的信息

我们知道一个用户组下面可以有很多用户,所以:user_group hasMany user

一个用户 属于 一个用户组,所以:user belongsTo user_group

同样是user_group和user表,但我们出发点不同,关系也就不一样了。

每个用户都应该有唯一一条用户信息数据,所以:user hasOne profile

一条用户信息 属于 一个用户,所以:profile belongsTo user

综上:

在User模型中,我们可以定义关联:

1
2
3
4
5
6
7
function user_group(){
return $this->belongsTo('UserGroup');
}

function profile(){
return $this->hasOne('Profile');
}

我们在查询中:

1
2
3
$user = model('User')->find();
$user = $user->user_group; // 这样user中就可以包含当前数据对应的user_group数据了
$user = $user->profile; // 这样user中就可以包含当前数据对应的profile数据了

在UserGroup模型中,我们可以定义关联:

1
2
3
function user(){
return $this->hasMany('User');
}

在Profile模型中,我们可以定义关联:

1
2
3
function user(){
return $this->belongsTo('User');
}

注:定义关联function的方法名可以随意定义,一般为表名或模型名;我们定义的时候是function,但获取时理解为获取属性,所以不加 ()

很多人理解是我定义了一个profile的方法,所以应该 $user->profile(),这里要特别注意下。

这样我们在查询时,就方便了,不需要使用大量的join。

原文地址

本文作者 : Richex
原文链接 : https://blog.richex.cn/540.html
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

欢迎打赏

微信扫一扫, 向我投食

微信扫一扫, 向我投食

支付宝扫一扫, 向我投食

支付宝扫一扫, 向我投食

留下足迹