2016-07-08 1 views
2

Ich versuche das jetzt für eine Weile und ich kann nicht scheinen, es herauszufinden.Laravel: Produkt Größenrelation mit einem Preis Pivot hinzufügen

So habe ich eine Produkte und eine Größen Tabelle mit einer zu vielen Beziehung gehört.

Also in meinem Modell habe ich:

public function sizes() 
{ 
    return $this->belongsToMany(Size::class, 'size_product')->withPivot('price'); 
} 

Meine Formen sieht wie folgt aus:

<h2 class="fields-holder__title">Sizes</h2> 
@foreach($sizes as $size) 
    <div class="field-holder__container"> 
     <input type="checkbox" name="sizes[]" value="{{ $size->id }}"> 
     <input type="text" name="prices[]" placeholder="Price"> 
    </div> 
@endforeach 

Und in meinem Controller:

My forms looks like this (don't loog at the styles)

Meine Klinge sieht wie folgt aus auf dem Post mache ich:

// add and remove sizes pivot 
$sizes = []; 
foreach ($request->sizes as $size) { 
    array_push($sizes, $size); 
} 
$product->sizes()->sync($sizes); 

Aber wie spare ich die Preise?

Ich weiß, dass Sie dies in Laravel tun können:

$product->sizes()->sync($size, ['price' => $price]); 

Aber wie bekomme ich diese in der foreach.

Ich hoffe, dass mir jemand helfen kann.

Danke!

Antwort

1

Zunächst einmal gehört die Logik zum Speichern des Produkts mit den entsprechenden Größen/Preisen nicht zu Ihrem Controller, sondern zu Ihrem Modell (oder einer Zwischendatenebene).

Wie für Ihr Problem: Sie können nur Pivot-Beziehungen zu einem Datensatz speichern, die bereits eine ID hat, dh. eine, die bereits in der Datenbank gespeichert wurde. Außerdem ist die sync()-Methode für die Klasse "objectsToMany" zum Speichern mehrerer Beziehungen nach IDs gedacht und akzeptiert einen booleschen Wert als zweites Argument (unabhängig davon, ob die Verknüpfung aufgehoben werden soll oder nicht, der Standardwert ist true).

In diesem Fall sollten Sie eine foreach über das Array von Größen, ein attach() jeder, mit seinem Preis, zum übergeordneten Modell. Etwas wie folgt aus:

ProductsController.php

public method store(Request $request) 
{ 
    // call the create method on the model 
    $product = Product::createForSizes(
     $request->only('name', 'sizes', 'prices') 
    ); 

    return $product 
     ? redirect()->route('some.route') 
     : redirect()->route('some.other.route'); 
} 

product.php

public static method createForSizes($name, array $sizes, array $prices) 
{ 
    // create and save a new instance of the model 
    if(!$product = static::create(compact('name'))) { 
     return false; 
    } 

    // attach each size, with it's price 
    foreach($sizes as $index => $id) { 
     $price = isset($prices[$index]) ? $prices[$index] : null; 
     $product->sizes()->attach($id, compact('price')); 
    } 

    return $product; 
} 

Hinweis: Laravel sucht nach Pivot-Tabellen automatisch, wenn Sie sie als mehrere Namen in alphabetischer Reihenfolge. Also, wenn Sie Ihre Pivot-Tabelle products_sizes nennen, können Sie die Tabellennamen aus der Beziehung Methode, wie so auslassen:

public function sizes() 
{ 
    return $this->belongsToMany(Size::class)->withPivot('price'); 
}