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();
其他情况,如多对一,可以转化为一对多
如果有多对多的情况,可以建立,也必须建立中间表,从而转化为一对多+多对一的问题。
最后:官方文档写的实在太简略了,不利于推广使用