模型多对多的关联写入
php
class User extends Model
{
protected $table = 'user';
//多对多关联
public function roles()
{
return $this->belongsToMany(Role::class, 'user_role', 'user_id', 'role_id');
}
}
class Role extends Model
{
protected $table = 'role';
}
多对多的新增:
php
// 得到要添加权限的用户
$user = User::find(1);
// 得到权限的 id,比如超级管理员
$roleId = 1;
// 设置成超级管理员
$user->roles()->attach($roleId);
sql
select * from `user` where `user`.`id` = ? limit 1
-- [1]
insert into `user_role` (`role_id`, `user_id`) values (?, ?)
-- [1,1]
给中间表附加detail字段的数据,可以使用第二参数
php
$user = User::find(1);
$user->roles()->attach(1, ['detail'=> '备注']);
sql
select * from `user` where `user`.`id` = ? limit 1
-- [1]
insert into `user_role` (`detail`, `role_id`, `user_id`) values (?, ?, ?)
-- ["备注",1,1]
移出某个用户的角色权限
php
// 删除一个角色权限
$user->roles()->detach(1);
// PS:如果不指定中间表 id,那么就移出这个用户的所有权限角色;
sql
select * from `user` where `user`.`id` = ? limit 1
-- [1]
delete from `user_role` where `user_role`.`user_id` = ? and `user_role`.`role_id` in (?)
-- [1,1]
批量处理
php
// 这里传递的是角色权限表的 ID
$user->roles()->attach([1,2,3]);
$user->roles()->detach([1,2,3]);
sql
select * from `user` where `user`.`id` = ? limit 1
-- [1]
insert into `user_role` (`role_id`, `user_id`) values (?, ?), (?, ?), (?, ?)
-- [1,1,2,1,3,1]
sql
sql: select * from `user` where `user`.`id` = ? limit 1
-- [1]
delete from `user_role` where `user_role`.`user_id` = ? and `user_role`.`role_id` in (?, ?, ?)
-- [1,1,2,3]
同步关联,已存在不在新增
php
$user->roles()->sync([1,2,3])
sql
select * from `user` where `user`.`id` = ? limit 1
-- [1]
select * from `user_role` where `user_role`.`user_id` = ?
-- [1]
insert into `user_role` (`role_id`, `user_id`) values (?, ?)
-- [1,1]
insert into `user_role` (`role_id`, `user_id`) values (?, ?)
-- [2,1]
insert into `user_role` (`role_id`, `user_id`) values (?, ?)
-- [3,1]
更新指定roleId的额外字段
// 更新中间表的额外字段
php
$user->role()->updateExistingPivot(1, ['detail'=>'喀']);
sql
select * from `user` where `user`.`id` = ? limit 1
-- [1]
update `user_role` set `detail` = ? where `user_role`.`user_id` = ? and `role_id` in (?)
-- ["喀",1,1]