用户模型:
public function positions() { return $this->belongsToMany('App\Position')->withPivot('company_id')->withTimestamps(); }
职位模型:
public function users() { return $this->belongsToMany('App\User')->withPivot('company_id')->withTimestamps(); }
在表单提交上我有两个数组:
$allPositionIds array:3 [ 0 => 98 1 => 99 2 => 100 ] $allCompanyIds array:3 [ 0 => 129 1 => 130 2 => 131 ]
运用
$user->positions()->sync($allPositionIds);
将position_user表按预期与用户和相应的位置id同步.
但是我无法弄清楚如何填充额外的字段(‘company_id’)
这是我期望的工作方式:
$user->positions()->sync([$allPositionIds => ['company_id' => $allCompanyIds]],false);
我已经阅读了manual,但我只是没有看到如何处理这些数组,因为手册中的示例似乎与要填充的额外字段不是多个项目的数组的情况有关:
$user->roles()->sync(array(1 => array('expires' => true)));
我试过用这个answer
合并两个数组:
$syncData = array_combine($allPositionIds,$allCompanyIds);
并得到$syncData:
array:3 [ 98 => 129 99 => 130 100 => 131 ]
相应地映射到位置id数组和公司ID数组,但如果我尝试
user->positions()->sync($syncData);
我得到一个“sqlSTATE [23000]:完整性约束违规:1452无法添加或更新子行:外键约束失败” – 我相信它正在尝试将company_id添加为另一个position_user.position_id,但随后它出错为在职位表中不存在.
无论我正在尝试什么,我的company_id字段仍未更新/填充.
我做错了什么,如何更新该字段?
解决方法
你其实非常接近.所需格式为:
[ 98 => ['company_id' => 129],99 => ['company_id' => 130],100 => ['company_id' => 131] ]
这应该生成正确的数组:
$extra = array_map(function($companyId){ return ['company_id' => $companyId]; },$allCompanyIds); $data = array_combine($allPositionIds,$extra); $user->positions()->sync($data);