我无法在数据透视表中注册额外字段: 这是我的计划:
买家型号:
public function qualities(){
//many-to-many relation
return $this->belongsToMany(Quality::class);
}
质量模型:
public function qualities(){
//many-to-many relation
return $this->belongsToMany(Quality::class);
}
产品型号:
public function buyers(){
//many-to-many relation
return $this->belongsToMany(Buyer::class);
}
在将数据发送到
sync
函数之前,我正在合并数据:
public function store(createBuyerRequest $request){
if($request->validated()){
try{
//Register buyer
$buyer = new Buyer;
$buyer->ruc = $request->ruc;
$buyer->companyName = $request->companyName;
$buyer->contact = $request->contact;
$buyer->address = $request->address;
$buyer->phone = $request->phone;
$buyer->email = $request->email;
$buyer->save();
$arrayQualitiesIds = $request->get('qualitiesProductCheckbox');
//Build arrayMap
$extra = array_map(function($qualityId) use($request){
return ['quality_id' => $qualityId, 'product_id' => $request->product];
}, $arrayQualitiesIds);
// Combine the array
$data = array_combine($arrayQualitiesIds, $extra);
$buyer->qualities()->sync($data);
return redirect()->route('admin.buyers.index')
->with('status_success','Comprador registrado correctamente!');
}catch(Exception $e){
return redirect()->route('admin.buyers.index')
->with('cancel','No se pudo registrar el comprador. '.$e->getMessage());
}
}
}
一个示例的
$data = array_combine($arrayQualitiesIds, $extra)
的输出是这样的:
输出:
1 => array:2 [▼
"quality_id" => "1"
"product_id" => "5"
]
2 => array:2 [▼
"quality_id" => "2"
"product_id" => "5"
]
3 => array:2 [▼
"quality_id" => "3"
"product_id" => "5"
]
组合成功!但是无法在数据透视表中注册数据,只能注册买家。
这是注册买家表格的视图:
基本上,买家正在注册并选择感兴趣的产品和他的品质。企业希望用他想要的产品注册买家。
代码
$buyer->qualities()->sync($data);
应使用关系自动注册buyer_id
,并用放入$data
中的数组组合填充数据透视表。
任何解决这个问题的想法我都会很感激,非常感谢。
已修复
我刚刚修改了
Buyer
模型内部的关系:
public function qualities(){
return $this->belongsToMany(Buyer::class, 'product_interested','quality_id', 'product_id','buyer_id')->withTimestamps();;
}
我还需要在
buyer_id
里面添加 array_map
:
$extra = array_map(function($qualityId) use($request, $buyer){
return ['quality_id' => $qualityId,
'product_id' => $request->product,
'buyer_id' => $buyer->id];
}, $arrayQualitiesIds);
//combine arrays
$data = array_combine($arrayQualitiesIds, $extra);
/*
dd($data);
array:1 [▼
4 => array:3 [▼
"quality_id" => "4"
"product_id" => "6"
"buyer_id" => 19
]
]
*/
$buyer->qualities()->sync($data);
我不知道为什么
$buyer->qualities()->sync($data)
没有自动插入buyer_id
您必须在关系方法中指定数据透视表的名称,如下所示:
买家型号:
public function qualities(){
//many-to-many relation
return $this->belongsToMany(Quality::class, 'product_interested');
}