如何在Laravel MongoDB(jenssegers/mongodb)中修改多对多关联关系?
如何在Laravel MongoDB(jenssegers/mongodb)中修改多对多关联关系?
嘿,刚好之前我用jenssegers/mongodb处理过类似的多对多关联修改需求,给你唠唠具体怎么操作最顺手~
先把关联模型定义对(关键!)
首先得让Laravel的Eloquent关联机制帮我们自动维护两边的ID数组,而不是手动去改,这样不容易出错。给你贴一下User和Organization模型的正确写法:
User模型
use Jenssegers\Mongodb\Eloquent\Model; class User extends Model { protected $connection = 'mongodb'; // 指定MongoDB连接 protected $collection = 'users'; // 对应users集合 // 定义和Organization的多对多关联 public function organizations() { // 参数说明:关联模型、中间表(MongoDB不需要,传null)、当前模型存关联ID的字段、关联模型存当前ID的字段 return $this->belongsToMany(Organization::class, null, 'organization_ids', 'user_ids'); } }
Organization模型
use Jenssegers\Mongodb\Eloquent\Model; class Organization extends Model { protected $connection = 'mongodb'; protected $collection = 'organizations'; public function users() { return $this->belongsToMany(User::class, null, 'user_ids', 'organization_ids'); } }
这里要注意belongsToMany的后两个参数:当前模型里存关联ID的字段在前,关联模型里的对应字段在后,别搞反了哦!
常用的关联修改操作
定义好关联后,就可以用Laravel熟悉的关联方法来修改了,包会自动帮我们更新两边集合里的ID数组,省心得很~
1. 添加单个关联
比如给某个用户添加一个组织:
// 找到目标用户和组织 $user = User::find('682c76340e27458132051650'); $targetOrg = Organization::find('你的组织ID'); // 调用attach方法,自动更新user的organization_ids和org的user_ids $user->organizations()->attach($targetOrg->_id);
反过来给组织添加用户也是一样的:
$targetOrg->users()->attach($user->_id);
2. 批量添加关联
一次给用户加多个组织?直接传ID数组就行:
$user->organizations()->attach(['org_id_1', 'org_id_2', 'org_id_3']);
3. 移除单个关联
要取消用户和某个组织的关联:
$user->organizations()->detach($targetOrg->_id);
4. 批量移除关联
一次移除多个组织关联:
$user->organizations()->detach(['org_id_1', 'org_id_2']);
5. 替换所有关联(清空现有,添加新的)
如果想把用户的所有组织关联换成新的一批,用sync方法:
// 执行后,用户的organization_ids只会保留这两个新ID,同时组织的user_ids也会同步更新 $user->organizations()->sync(['new_org_id_1', 'new_org_id_2']);
手动修改数组(不推荐,但可以应急)
如果你不想用关联方法,非要手动操作集合里的ID数组,也能做到,但要记得两边都要更新,不然会出现数据不一致的问题:
// 给用户的organization_ids追加一个ID $user->push('organization_ids', '目标组织ID'); $user->save(); // 同时要给对应的组织的user_ids也追加用户ID $targetOrg->push('user_ids', $user->_id); $targetOrg->save(); // 移除的话用pull方法 $user->pull('organization_ids', '要移除的组织ID'); $user->save(); $targetOrg->pull('user_ids', $user->_id); $targetOrg->save();
这种方法容易漏更一边,所以还是优先用前面的关联方法哈~
内容来源于stack exchange
相关产品推荐
相关产品推荐

