TP-THINKPHP模型 hasOne、hasMany、belongsTo详解
2022-11-24 11:10:29
208
{{single.collect_count}}

底部代码直接复制

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模型中,我们可以定义关联:

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

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

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

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

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

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

$data = (new User())->with(['user_group' => function($query) {$query->field('id,title');},'profile' => function($query) {$query->field('id,user_id,nickname,sex');}])->where('id', 1)//$this->auth->id->limit(($page - 1) * $pagesize, $pagesize)->select();

如果对您有帮助的话,请点击底部
点赞,评论,分享,收藏,打赏,关注,谢谢

回帖
全部回帖({{commentCount}})
{{item.user.nickname}} {{item.user.group_title}} {{item.friend_time}}
{{item.content}}
{{item.comment_content_show ? '取消' : '回复'}} 删除
回帖
{{reply.user.nickname}} {{reply.user.group_title}} {{reply.friend_time}}
{{reply.content}}
{{reply.comment_content_show ? '取消' : '回复'}} 删除
回帖
收起
没有更多啦~
{{commentLoading ? '加载中...' : '查看更多评论'}}