无法使用 Laravel 的同步功能在数据透视表中注册额外的字段

问题描述 投票:0回答:1

我无法在数据透视表中注册额外字段: 这是我的计划:

买家型号:

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

php laravel pivot-table laravel-8 eloquent-relationship
1个回答
0
投票

您必须在关系方法中指定数据透视表的名称,如下所示:

买家型号:

public function qualities(){
    //many-to-many relation
    return $this->belongsToMany(Quality::class, 'product_interested');
}
© www.soinside.com 2019 - 2024. All rights reserved.