ThinkPHP5——模型关联(一对一关联)
定义
定义一对一关联使用了hasOne,hasOne
方法的参数包括:
hasOne('关联模型名','外键名','主键名',['模型别名定义'],'join类型');
下面定义一个用户表,公司给每个用户发一辆车,表结构如下:
#汽车表 create table car ( id int primary key AUTO_INCREMENT comment "编号", brand varchar(255) comment '汽车名称', plate_number varchar(255) comment '汽车号码', uid int comment '用户表' ) #用户表 create table user ( id int primary key AUTO_INCREMENT comment "编号", name varchar(255) comment '姓名', sex varchar(255) comment '性别', age varchar(255) comment '年龄', section varchar(255) comment '部门' )
user的模型使用hasOne()方法关联car表:
<?php namespace app\demo\model; use think\Model; class User extends Model { //定义关联方法 public function car(){ //hasOne('汽车表','汽车外键','用户主键',['模型别名定义'],'join类型'); return $this->hasOne('car','uid','id'); } }
关联查询
//关联查询 $user = User::get(1); print_r($user->car); echo "车牌:{$user->car->plate_number},用户名:{$user->name}"; //或者 $user = User::get(1,'car');
以上只能获取单条关联信息,如果想要获取全部关联信息,如下:
//方法一:使用关联预查询功能,有效提高性能。 $list = User::with('car')->select(); foreach($list as $user){ echo "车牌:{$user->car->plate_number},用户名:{$user->name}<br>"; } //方法二:获取全部关联信息 $list = User::all(); foreach($list as $user){ // 获取用户关联的car模型数据 echo "车牌:{$user->car->plate_number},用户名:{$user->name}<br>"; }
关联新增
//关联新增 $user = new User; $user->name='老黄'; $user->sex='男'; $user->age="24"; $user->section='开发部'; if ($user->save()){ $car['brand']='奔驰'; $car['plate_number']='A31949'; //uid 不需要指定,自动添加 $user->car()->save($car); return "用户:{$user->name}新增成功"; }
注:添加是uid不需要指定,自动添加;先新增user的信息,再新增car的信息
关联更新
//关联更新 $user = User::get(1); $user->name = '小胜'; if($user->save()){ //更新关联数据 $user->car->plate_number = '粤-A31937'; $user->car->save(); }
注:这是是先更新user的信息,再更新car的信息
关联删除
//关联删除 $user = User::get(3); if($user->delete()){ //删除关联数据 $user->car->delete(); return "用户:{$user->name}删除了"; }
注:这是是先删除user的信息,再删除car的信息