ThinkPHP5模型关联
创建thinkPHP模型
用cmd指令在文件根目录下创建模型php think make:model 模块/模型名称
模型命名
模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写,比如表的表前缀是db_
在模型名称里就需要省略掉。所以db_admin
表的模型类名就是Admin
,db_admin_message
的模型类名就是AdminMessage
一对一关联
hasOne
hasOne(‘关联模型名’,’关联外键’,’主键’,’别名定义’, ‘join类型’)
关联操作都是基于(第一)模型的话,(第二)模型中并不需要定义关联方法,使用belongsTo 方法就可以。
belongsTo 方法和 hasOne 一样,也有5个参数:
belongsTo
belongsTo(‘关联模型名’,’关联外键’,’关联模型主键’,’别名定义’,’join类型’)
模型定义
1 | // 定义关联方法,在User模型哄下定义 |
在User模型定义好关联的方法之后在Profile模型里可以不用写任何对应的方法,但是必须最少要有一个对应db_Profile 表的空模型。
倘若关联操作都基于profile方法时,在Profile模型下定义
1 | public function user() |
控制器调用
1 | public function index($name='name') |
输出结果:
一对多关联
hasMany
hasMany(‘关联模型名’,’关联外键’,’关联模型主键’,’别名定义’)
模型调用
1 | public function books() |
控制器调用
关联添加: 也可以批量增加数据
关联查询: 可以直接调用模型的属性获取全部关联数据
1
2
3
4
5
6
7
8
9
10public function read()
{
$user = UserModel::get(1);
// 获取状态为1的关联数据
$books = $user->books()->where('status',1)->select();
dump($books);
// 获取作者写的某本书
$book = $user->books()->getByTitle('ThinkPHP5快速入门');
dump($book);
}关联更新:
1
2
3
4
5
6
7public function update($id)
{
$user = UserModel::get($id);
$book = $user->books()->getByTitle('ThinkPHP5开发手册');
$book->title = 'ThinkPHP5快速入门';
$book->save();
}关联删除:
1
2
3
4
5
6
7
8//删除部分关联数据:
$book = $user->books()->getByTitle('ThinkPHP5开发手册');
$book->delete();
//删除所有的关联数据:
if($user->delete()){
// 删除所有的关联数据
$user->books()->delete();
}
多对多关联
一个用户会有多个角色,同时一个角色也会包含多个用户,这就是一个典型的多对多关联
多对多关联通常一定会有一个中间表,也称为枢纽表,所以需要创建一个用户角色的中间表
belongsToMany 的参数如下
belongsToMany(‘关联模型名’,’中间表名称’,’关联外键’,’关联模型主键’,’别名定义’)
对于枢纽表并不需要创建模型类,在多对多关联关系中,并不需要直接操作枢纽表。
模型定义
1 | // 定义多对多关联 |
- 关联新增
新增用户角色 并自动写入枢纽表$user->roles()->save(['name' => 'editor', 'title' => '编辑']);
- 批量新增
1
2
3
4$user->roles()->saveAll([
['name' => 'leader', 'title' => '领导'],
['name' => 'admin', 'title' => '管理员'],
]);
由于该角色已经存在了,所以只需要使用attach 方法增加枢纽表的关联数据:$user->roles()->attach($role);
- 关联删除
使用detach 方法删除关联的枢纽表数据,但不会删除关联模型数据$user->roles()->detach($role);
删除枢纽表的同时删除关联模型$user->roles()->detach($role,true);
##3 模型输出
输出数组: toArray 方法把模型对象输出为数组。
$user->toArray()
隐藏属性:hidden方法在输出的时候隐藏某些属性
指定属性:visible方法指定一些属性输出
追加属性
如果读取器定义了一些非数据库字段的读取,例如:1
2
3
4
5
6
7
8
9class 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()