Laravel attach pivot data without errors

Viewed 1372

I a have pivot table and a relation on model Product:

public function product_bodies()
{
    return $this->belongsToMany(static::class, 'product_bodies')->withPivot('product_id', 'product_body_id');
}

In the controller when I want to attach data:

    $products = ['sadasdasd', 'asdasda', 'asdasd', 'asdasd']; //for column product_body_id
    $product = Product::create($request->all());

    $product->product_bodies()->attach($products);

I get the error:

General error: 1364 Field 'product_body_id' doesn't have a default value

If I do this:

public function product_bodies()
{
    return $this->belongsToMany(static::class, 'product_bodies', 'product_id', 'product_body_id')->withPivot('product_id', 'product_body_id');
}

Then all works well. But then I can't get pivot data with:

$product->product_bodies;

I get empty items..

How can I fix this problem?

Table product_bodies has 3 columns:

  • id
  • product_id
  • product_body_id

In product_body_id I pass strings.

1 Answers

I have 3 ideas:

  1. You need to replace static::class to '\App\ProductBody' or ProductBody::class

    public function product_bodies()
    {
        return $this->belongsToMany('\App\ProductBody', 'product_bodies')->withPivot('product_id', 'product_body_id');
    }
    
  2. $products must be array of product bodies ids.

    $productBodiesIds = [1, 55, 66];
    $product->product_bodies()->attach($productBodiesIds);
    
  3. Maybe, sync instead of attach will be a better solution.

Related