模型hasOne、hasMany、belongsTo详解

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');
} 

注:定义关联function的方法名可以随意定义,一般为表名或模型名;我们定义的时候是function,但获取时理解为获取属性,所以不加();
很多人理解是我定义了一个profile的方法,所以应该$user->profile(),这里要特别注意下。

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

/***************/
在使用的时候需要先在要关联的主表模型定义一个方法,这个方法会将表2的id关联模型的id,并定义要返回的字段(id必须作为返回项)

public function Prov()
    {
        return $this->hasOne(表2,表2的关联字段, 模型的关联字段)->field('表2的id,表2的name');
    }

定义完成后将定义的方法用with预加载进list方法内,这样在控制器内使用这个模型的lists方法时会自动将模型和表2进行关联查询,完成后返回关联查询的结果

public function lists($where, $page, $listRow)
    {
        $lists = $this
            ->with('prov')
            ->where($where)
            ->page($page, $listRow)
            ->select();
        if (!empty($lists))
        {
            return $lists->toArray();
        } else
        {
            return [];
        }
    }

你可能感兴趣的:(模型hasOne、hasMany、belongsTo详解)