ThinkPHP6.0学习笔记-模型操作 (6)

主键:当前模型的主键,自动获取也可以指定

class UserModel extends Model { protected $table = \'tp_user\'; public function profile() { return $this->hasOne(ProfileModel::class , \'user_id\' , \'id\'); } } class ProfileModel extends Model { protected $table = \'tp_profile\'; } $user = model\UserModel::find(19); //return json($user->profile); return $user->profile->hobby;

使用save()设置关联修改,通过主表修改附表字段的值

$user = UserModel::find(19); $user->profile->save([\'hobby\'=>\'美女\']);

->profile()方法新增数据

$user->profile()->save([\'hobby\'=>\'靓女\']);

相对关联(反向)

belongsTo(\'关联模型\',\'外键\',\'关联主键\')

belonsTo模式适合于附属表关联主表

class ProfileModel extends Model { protected $table = \'tp_profile\'; public function user() { return $this->belongsTo(UserModel::class , \'user_id\' , id\'); } } $profile = ProfileModel::find(1); return $profile->user;

使用hasOne()模拟belongsTo()

$user = UserModel::hasWhere(\'profile\',[\'id\'=>19])->find(); // 这里的profile是user模型勒种的方法而不是profile模型类 $user = UserModel::hasWhere(\'profile\',function($query){ $query->where(\'profile.id\',19); })-select();

一对多关联-hasMany

hasMany模式适合主表关联附表,实现一对多查询;与一对一查询的主要区别就是,hasMany可以实现查询返回多条。

hasMany(\'关联模型\',[\'外键\',\'主键\']);

使用->profile()方法模式,可以对数据进行筛选

$user->profile()->where(\'id\',\'>\',19)->select()

调用属性方式会直接返回结果,调用方法方式可以进行中间处理

使用has()方法查询关联附表的主表内容

$user = UserModel::has(\'profile\',\'>=\',2)->select(); return $user;

这里的查询是在附表中判断数据与主表的关联内容

上述代码的主要功能:在附表中查找与主表有两次以上关联的数据,例如id=19在附表中两两条关联数据

使用haswhere查询关联附表的处理内容(反向关联)

$user = UserModel::hasWhere(\'profile\',[\'status\'=>1])->select(); return $user; $user = UserModel::hasWhere(\'profile\',function($query){ $query->where(\'status\',\'>=\',1); })->select();

使用save()/saveAll() 新增数据

$user = UserModel::find(20); // 新增单条数据 $user->profile()->save([\'hobby\'=>\'计算机\',\'status\'=>\'1\']); // 新增批量数据 $user->profile()->saveAll([ [\'hobby\'=>\'计算机\',\'status\'=>\'1\'], [\'hobby\'=>\'游戏机\',\'status\'=>\'1\'] ]);

使用together()删除主表内容时,附表关联的内容全部删除

$user = UserModel::with(\'profile\')->find(20); $user->together([\'profile\'])->delete(); 关联预载入 with

普通的关联查询,会循环执行多次SQL查询;

$list = UserModel::select([19,20,21]); foreach($list as $user) { dump($user->profile); }

采用关联预载入的方式 ,可以减少多次查询的耗时;

with([\'关联数据表1\',\'关联数据表2\']);

延迟预载入:先执行select()再执行load()

关联统计

使用withCount()可以统计主表关联附表的个数,使用profile_count

$list = UserModel::withCount([\'profile\'])->select([19,20,21]); foreacth($list as $user) { echo $user->profile_count; }

关联统计的输出采用"[关联方法名]_count"的结构

同时支持withMax``withMin``withSum``withAvg……

关联输出

使用hidden()方法,隐藏主表字段或附表字段

$list = Usermodel::with(\'profile\')->select(); return json($list->hidden([\'profile.status\']));

使用visible()方法,只显示指定字段

使用append()方法,添加额外的字段

多对多关联

三张表:
access表包含了user和role表的关联ID

belongsToMany(\'关联模型\',\'中间表\',[\'外键\',\'关联键\'])

关联模型:模型名或类名
中间表:{需要继承Pivot}
外键:
关联键:中间表的当前模型关联键名

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzdsyy.html