主键:当前模型的主键,自动获取也可以指定
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(); 一对多关联-hasManyhasMany模式适合主表关联附表,实现一对多查询;与一对一查询的主要区别就是,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
关联模型:模型名或类名
中间表:{需要继承Pivot}
外键:
关联键:中间表的当前模型关联键名