TP5,数据模型model关联关系和关联查询笔记

一对一:

如:人和身份证的关系。

即A表的一条数据,对应B表的一条数据;B表的一条数据,对应A表的一条数据。

model类操作:

需要在你要管理/操作的那个model内,加上关系

例如:

业务需求:查某人信息,同时关联查询出他的身份证信息。

人  表  user:id,name,codeid(此列对应身份证表id)

身份证表  code:id,codenum

首先,在user的model里加入:

class User extends Model
{
 //usercode名字是自定义的,不受限制,尽量以开头小写的驼峰式命名法
 public function usercode()
  { 
    //第一个参数:关联的表名(关联谁?)
    //第二个参数:user表的外键(关联谁的啥?)
    //第三个参数:对应的code表的主键(我用啥去关联这个?)
    //后两个参数可以省略,不建议
    return $this->hasMany("code","id","codeid"); 
  }
}

 

其次,在user的controller类里,使用的时候如下:

//以插入为列子:
$list = $this->request->param();
//先添加user表数据
$u=new User();
$u->allowField(true)->save($list); 

//同时添加身份证信息,一对一关联 (user的实例内已经有了save后的id)
$u->usercode()->save();

查询时加入->with("自定义方法名"),如->with("usercode")

一对多:

如:班级和学生的关系

一个班级有多个学生,一个学生只属于一个班级

例如:

业务需求:查某学生信息,同时关联查询该学生所属班级。

班级表  class:id,name(这里不考虑class保留字段的问题)

学生表  students:id,name,classid(此列对应班级id)

首先,在学生的model里加入:

class Students extends Model
{
  public function getclass()
  {     
//第一个参数:关联的表名(关联谁?)     //第二个参数:class表的主键(关联谁的啥?)     //第三个参数:对应的学生表的外键(我用啥去关联这个?)     //后两个参数可以省略,不建议     return $this->hasMany("Class","id","classid");
  }
}

 

其次,在students的controller类里,使用的时候如下:

$list = (new Students())->where("条件什么的")->with("getclass")->select();

 


其他情况,如多对一,可以转化为一对多

如果有多对多的情况,可以建立,也必须建立中间表,从而转化为一对多+多对一的问题。

 

最后:官方文档写的实在太简略了,不利于推广使用

 

posted @ 2020-04-16 14:49  景北斗  阅读(2235)  评论(0编辑  收藏  举报