Laravel使用额外的列

时间:2017-09-17 19:37:10

标签: laravel many-to-many

在数据库中我有一张产品和组件表 我有一个表为多对多的关系,这是component_product 它具有(product_id,component_id,quantity)

的属性

在模型产品中

class Product extends Model
{
      protected $fillable = [
         'name','price','user_id','is_avilable','description'
     ];

     public function components()
     {
        return $this->belongsToMany('App\Component')
            ->withPivot('quantity');
     }
}

在视图中

{!! Form::select('component_id[]',$components,null !!}
{!! Form::select('component_id[]',$components,null !!}
{!! Form::number('quantity[]',null ]) !!}
{!! Form::number('quantity[]',null ]) !!}
控制器中的

public function store(Request $request)
{
         $product= Product::create( $request->all() );
         $product->components()->sync($request->component_id => ['quantity'=> $request->quantity ] );

}

它给出了非法偏移类型错误

  

注意:如果模具转储$ request->数量或$ request-> component_id,它将正确获取数组

2 个答案:

答案 0 :(得分:0)

在laravel docs(https://laravel.com/docs/5.5/eloquent-relationships

中同步示例
$user->roles()->sync([1 => ['expires' => true], 2, 3]);

尝试使用,

更改=>

所以在你的情况下:

$product->components()->sync([$request->component_id => ['quantity'=> $request->quantity]]);

答案 1 :(得分:0)

这就是我如何解决自己的问题 在Laravel文档中

$user->roles()->sync([1 => ['expires' => true], 2, 3]);

所以要匹配这个

$manyToMany = array();
         for ( $i=0 ; $i< count($request->component_id); $i++ )
         {
            $manyToMany[ $request->component_id[$i] ] = ['quantity' =>$request->quantity[$i] ];
         }
         $product->components()->sync($manyToMany);

是他们的更好的解决方案