thinkphp 多对多关联

//关联定义
<?php
namespace app\index\model;

use think\Model;

class User extends Model 
{
    public function roles()
    {
        return $this->belongsToMany('Role');
    }
}

/*
belongsToMany('关联模型','中间表','外键','关联键');
关联模型(必须):模型名或者模型类名
中间表:默认规则是当前模型名+_+关联模型名 (可以指定模型名)
外键:中间表的当前模型外键,默认的外键名规则是关联模型名+_id
关联键:中间表的当前模型关联键名,默认规则是当前模型名+_id

*/

//中间表名无需添加表前缀,并支持定义中间表模型,例如:

    public function roles()
    {
        return $this->belongsToMany('Role','\\app\\model\\Access');
    }
//中间表模型类必须继承think\model\Pivot,例如:

<?php
namespace app\index\model;

use think\model\Pivot;

class Access extends Pivot
{
    protected $autoWriteTimestamp = true;
}
//中间表模型的基类Pivot默认关闭了时间戳自动写入,上面的中间表模型则开启了时间戳字段自动写入。



//关联查询
$user = User::get(1);
// 获取用户的所有角色
$roles = $user->roles;
foreach ($roles as $role) {
	// 输出用户的角色名
	echo $role->name;
    // 获取中间表模型
    dump($role->pivot);
}


//关联新增
$user = User::get(1);
// 给用户增加管理员权限 会自动写入角色表和中间表数据
$user->roles()->save(['name'=>'管理员']);
// 批量授权
$user->roles()->saveAll([
    ['name'=>'管理员'],
    ['name'=>'操作员'],
]);

//只新增中间表数据(角色已经提前创建完成),可以使用:
$user = User::get(1);
// 仅增加管理员权限(假设管理员的角色ID是1)
$user->roles()->save(1);
// 或者
$role = Role::get(1);
$user->roles()->save($role);
// 批量增加关联数据
$user->roles()->saveAll([1,2,3]);


//单独更新中间表数据,可以使用:
$user = User::get(1);
// 增加关联的中间表数据
$user->roles()->attach(1);
// 传入中间表的额外属性
$user->roles()->attach(1,['remark'=>'test']);
// 删除中间表数据
$user->roles()->detach([1,2,3]);


//注:attach方法的返回值是一个Pivot对象实例,如果是附加多个关联数据,则返回Pivot对象实例的数组。

//定义相对的关联

//我们可以在Role模型中定义一个相对的关联关系,例如:

<?php
namespace app\index\model;

use think\Model;

class Role extends Model 
{
    public function users()
    {
        return $this->belongsToMany('User');
    }
}







 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ThinkPHP6中,实现一对多关联查询的方法是使用hasMany模式。具体设置方式如下: 1. 在主表的模型中使用hasMany方法进行关联设置: ``` public function 附表名() { return $this->hasMany(附表模型::class, '外键字段', '主键字段'); } ``` 例如: ``` public function profile() { return $this->hasMany(Profile::class, 'user_id', 'id'); } ``` 2. 进行一对多关联查询: ``` $user = UserModel::find(主表记录的id); return json($user->附表关联方法名); ``` 例如: ``` $user = UserModel::find(19); return json($user->profile); ``` 3. 进行数据筛选查询: ``` $user->附表关联方法名->where('条件字段', '条件操作符', '条件值'); ``` 例如: ``` $user->profile->where('id', '>=', 10); ``` 4. 使用has()方法查询满足条件的主表记录: ``` UserModel::has('附表关联方法名', '条件操作符', '条件值')->select(); ``` 例如: ``` UserModel::has('profile', '>=', 2)->select(); ``` 5. 使用together()方法,在删除主表记录时,同时删除关联的附表记录: ``` $user = UserModel::with('附表关联方法名')->find(主表记录的id); $user->together(['附表关联方法名'])->delete(); ``` 例如: ``` $user = UserModel::with('profile')->find(22); $user->together(['profile'])->delete(); ``` 以上就是在ThinkPHP6中实现一对多关联查询的方法。希望对你有所帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值