zoukankan      html  css  js  c++  java
  • tp5模型belongsTo和hasOne的区别

    在使用tp5模型的ORM的时候出现belongsTo和hasOne都有表示一对一的关系,但是二者并不相同。以下举例说明两者的区别: 
    首先有user表 字段 id name password字段 
    然后有user_address表 id user_id city字段

    在User模型中关联user_address表的时候使用hasOne,因为在user表中没有关联两个表的外键

    在UserAddress模型中关联user_address表的时候使用belongsTo,因为在user_address表中有关联两个表的外键user_id

    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. function user_group(){
    2.     return $this->belongsTo('UserGroup');
    3. }
    4. function profile(){
    5.    return $this->hasOne('Profile');
    6. }
    复制代码

    我们在查询中:
    $user = model('User')->find();
    $user = $user->user_group; //这样user中就可以包含当前数据对应的user_grou数据了
    $user = $user->profile;//这样user中就可以包含当前数据对应的profile数据了


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

    1. function user(){
    2.    return $this->hasMany('User');
    3. }
    复制代码

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

    1. function user(){
    2.     return $this->belongsTo('User');
    3. } 
    复制代码

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

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

  • 相关阅读:
    【LCT维护基环内向树森林】BZOJ4764 弹飞大爷
    【LCT】BZOJ3091 城市旅行
    【LCT+主席树】BZOJ3514 Codechef MARCH14 GERALD07加强版
    【最大权闭合子图】bzoj4873 [Shoi2017]寿司餐厅
    【LCT】BZOJ2049 [SDOI2008]Cave 洞穴勘测
    【有上下界的网络流】ZOJ2341 Reactor Cooling(有上下界可行流)
    【费用流】BZOJ1061: [Noi2008]志愿者招募(这题超好)
    从输入url到页面加载的过程
    forEach和map的区别
    理解 JavaScript 对象原型、原型链如何工作、如何向 prototype 属性添加新的方法。
  • 原文地址:https://www.cnblogs.com/microtiger/p/8421148.html
Copyright © 2011-2022 走看看