ThinkPHP5模型关联

Posted 2019-09-26updated 2020-05-06Words 1.2kReading time 8m

创建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
2
3
4
5
6
//	定义关联方法,在User模型哄下定义
public function profile()
{
//HASONE关联
return $this->hasOne('Profile''id', 'id');
}

在User模型定义好关联的方法之后在Profile模型里可以不用写任何对应的方法,但是必须最少要有一个对应db_Profile 表的空模型。

倘若关联操作都基于profile方法时,在Profile模型下定义

1
2
3
4
5
public function user()
{
//档案BELONGSTO关联操作都基于profile方法时,直接使用
return $this->belongsTo('User');
}

控制器调用

1
2
3
4
5
6
7
8
9
10
11
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();
}

输出结果:
1.png
2.png

一对多关联

hasMany

hasMany(‘关联模型名’,’关联外键’,’关联模型主键’,’别名定义’)

模型调用

1
2
3
4
public function books()
{
return $this->hasMany('Book','id','id');
}

控制器调用

  1. 关联添加: 也可以批量增加数据

  2. 关联查询: 可以直接调用模型的属性获取全部关联数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public function read()
    {
    $user = UserModel::get(1);
    // 获取状态为1的关联数据
    $books = $user->books()->where('status',1)->select();
    dump($books);
    // 获取作者写的某本书
    $book = $user->books()->getByTitle('ThinkPHP5快速入门');
    dump($book);
    }
  3. 关联更新:

    1
    2
    3
    4
    5
    6
    7
    public function update($id)
    {
    $user = UserModel::get($id);
    $book = $user->books()->getByTitle('ThinkPHP5开发手册');
    $book->title = 'ThinkPHP5快速入门';
    $book->save();
    }
  4. 关联删除:

    1
    2
    3
    4
    5
    6
    7
    8
    //删除部分关联数据:
    $book = $user->books()->getByTitle('ThinkPHP5开发手册');
    $book->delete();
    //删除所有的关联数据:
    if($user->delete()){
    // 删除所有的关联数据
    $user->books()->delete();
    }

多对多关联

一个用户会有多个角色,同时一个角色也会包含多个用户,这就是一个典型的多对多关联
多对多关联通常一定会有一个中间表,也称为枢纽表,所以需要创建一个用户角色的中间表
belongsToMany 的参数如下

belongsToMany(‘关联模型名’,’中间表名称’,’关联外键’,’关联模型主键’,’别名定义’)

对于枢纽表并不需要创建模型类,在多对多关联关系中,并不需要直接操作枢纽表。
模型定义

1
2
3
4
5
6
// 定义多对多关联
public function roles()
{
// 用户 BELONGS_TO_MANY 角色
return $this->belongsToMany('Role', 'think_access');
}
  1. 关联新增
    新增用户角色 并自动写入枢纽表
    $user->roles()->save(['name' => 'editor', 'title' => '编辑']);
  2. 批量新增
    1
    2
    3
    4
    $user->roles()->saveAll([
    ['name' => 'leader', 'title' => '领导'],
    ['name' => 'admin', 'title' => '管理员'],
    ]);

由于该角色已经存在了,所以只需要使用attach 方法增加枢纽表的关联数据:
$user->roles()->attach($role);

  1. 关联删除
    使用detach 方法删除关联的枢纽表数据,但不会删除关联模型数据
    $user->roles()->detach($role);
    删除枢纽表的同时删除关联模型
    $user->roles()->detach($role,true);

##3 模型输出

  1. 输出数组: toArray 方法把模型对象输出为数组。
    $user->toArray()

  2. 隐藏属性:hidden方法在输出的时候隐藏某些属性

    模型名->方法([字段名称,字段名称,***])
    $user->hidden(['create_time','update_time'])->toArray()

  3. 指定属性:visible方法指定一些属性输出

    模型名->方法([字段名称,字段名称,***])
    $user->visible(['id','nickname','email'])->toArray()

  4. 追加属性
    如果读取器定义了一些非数据库字段的读取,例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    class User extends Model
    {
    // status修改器
    protected function getUserStatusAttr($value)
    {
    $status = [-1 => '删除', 0 => '禁用', 1 => '正常', 2 => '待审核'];
    return $status[$value];
    }
    }

    如果需要输出(字段名称) 属性数据的话,可以使用append 方法
    $user->append(['user_status'])->toArray()

  5. 输出json:对于API 开发而言,经常需要返回JSON 格式的数据
    $user->toJson()