THINKPHP 5 的基本模型关联
2021-04-20
1.创建thinkPHP模型
用cmd指令在文件根目录下创建模型php think make:model 模块/模型名称
模型会创建在application目录下的 “模块\模型[模型名称]” 中。
2.模型命名
模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写,比如表的表前缀是 db_
在模型名称里就需要省略掉。所以 db_admin
表的模型类名就是 Admin
, db_admin_message
的模型类名就是AdminMessage
3.一对一关联
hasOne (‘关联模型名’,‘关联外键’,‘主键’,‘别名定义’, ‘join类型’)
关联操作都是基于(第一)模型的话,(第二)模型中并不需要定义关联方法,使用belongsTo 方法就可以。
belongsTo 方法和 hasOne 一样,也有5个参数:
belongsTo(‘关联模型名’,‘关联外键’,‘关联模型主键’,‘别名定义’,‘join类型’)
a.模型定义
// 定义关联方法,在User模型哄下定义 public function profile(){ //HASONE关联 return $this->hasOne('Profile','id', 'id'); }
在User模型定义好关联的方法之后在Profile模型里可以不用写任何对应的方法,但是必须最少要有一个对应db_Profile 表的空模型。
b.倘若关联操作都基于profile方法时,在Profile模型下定义
public function user(){ //档案BELONGSTO关联操作都基于profile方法时,直接使用 return $this->belongsTo('User'); }
c.控制器调用
public function index($name='name'){ //get 1 是获取id为 1 的数据 //find() 是查找 //toArray() 是获取到的数据转为数组 $admin= Admin::get(1); //查巡当前Admin模型数据 var_dump($admin->find()->toArray()); //查巡关联模型AdminMessage模型数据 $admin= $admin->AdminMessage->find()->toArray(); }
d.输出结果:
4.一对多关联
hasMany(‘关联模型名’,‘关联外键’,‘关联模型主键’,‘别名定义’)
a.模型调用
public function books(){ return $this->hasMany('Book','id','id'); }
b.控制器调用
关联添加:也可以批量增加数据
关联查询:可以直接调用模型的属性获取全部关联数据
public function read(){ $user = UserModel::get(1); // 获取状态为1的关联数据 $books = $user->books()->where('status',1)->select(); dump($books); // 获取作者写的某本书 $book = $user->books()->getByTitle('ThinkPHP5快速入门'); dump($book); }
关联更新:
public function update($id){ $user = UserModel::get($id); $book = $user->books()->getByTitle('ThinkPHP5开发手册'); $book->title = 'ThinkPHP5快速入门'; $book->save(); }
关联删除:
//删除部分关联数据: $book = $user->books()->getByTitle('ThinkPHP5开发手册'); $book->delete(); //删除所有的关联数据: if($user->delete()){ // 删除所有的关联数据 $user->books()->delete(); }
5.多对多关联
一个用户会有多个角色,同时一个角色也会包含多个用户,这就是一个典型的多对多关联
多对多关联通常一定会有一个中间表,也称为枢纽表,所以需要创建一个用户角色的中间表
belongsToMany 的参数如下
belongsToMany(‘关联模型名’,‘中间表名称’,‘关联外键’,‘关联模型主键’,‘别名定义’)
对于枢纽表并不需要创建模型类,在多对多关联关系中,并不需要直接操作枢纽表。
a.模型定义
// 定义多对多关联 public function roles(){ // 用户 BELONGS_TO_MANY 角色 return $this->belongsToMany('Role', 'think_access'); }
关联新增
新增用户角色 并自动写入枢纽表
$user->roles()->save(['name' => 'editor', 'title' => '编辑']);
批量新增
$user->roles()->saveAll([ ['name' => 'leader', 'title' => '领导'], ['name' => 'admin', 'title' => '管理员'], ]);
由于该角色已经存在了,所以只需要使用attach 方法增加枢纽表的关联数据:
$user->roles()->attach($role);
关联删除
使用detach 方法删除关联的枢纽表数据,但不会删除关联模型数据
$user->roles()->detach($role);
删除枢纽表的同时删除关联模型
$user->roles()->detach($role,true);
6.模型输出
输出数组: toArray 方法把模型对象输出为数组。
$user->toArray()
隐藏属性:hidden方法在输出的时候隐藏某些属性
模型名->方法([字段名称,字段名称,***]) $user->hidden(['create_time','update_time'])->toArray()
指定属性:visible方法指定一些属性输出
模型名->方法([字段名称,字段名称,***])
$user->visible(['id','nickname','email'])->toArray()
追加属性
如果读取器定义了一些非数据库字段的读取,例如:
class User extends Model{ // status修改器 protected function getUserStatusAttr($value){ $status = [-1 => '删除', 0 => '禁用', 1 => '正常', 2 => '待审核']; return $status[$value]; } }
如果需要输出(字段名称) 属性数据的话,可以使用append 方法
$user->append(['user_status'])->toArray()
输出json:对于API 开发而言,经常需要返回JSON 格式的数据
$user->toJson()
如果需要输出(字段名称) 属性数据的话,可以使用append 方法
$user->append(['user_status'])->toArray()
输出json:对于API 开发而言,经常需要返回JSON 格式的数据
$user->toJson()