2016-07-08 1 views
2

지금 당분간이 문제를 해결하려고 노력하고 있습니다.Laravel : 가격 피벗으로 제품 크기 관계를 추가하십시오.

그래서 Products 및 Size 테이블에는 많은 관계가 있습니다.

그래서 내 모델에서 내가 가진 :

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

내 양식은 다음과 같습니다

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

내 블레이드는 다음과 같습니다

<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 

을 그리고 내 컨트롤러 게시물에 내가 할 :

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

하지만 어떻게 가격을 절약 할 수 있습니까?

난 당신이 Laravel에서이 작업을 수행 할 수 있습니다 알고

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

하지만 난 foreach 문이를 얻는 방법에 대해 설명합니다.

누군가가 나를 도울 수 있기를 바랍니다.

감사합니다.

답변

1

우선, 해당 크기/가격으로 제품을 저장하는 논리는 컨트롤러에 속하지 않지만 모델 (또는 일부 중간 데이터 계층)에 속합니다.

문제의 경우 : 피벗 관계는 이미 ID가있는 레코드에만 저장할 수 있습니다. 즉, 하나는 이미 데이터베이스에 저장되었습니다. 또한 belongsToMany 클래스의 sync() 메소드는 ID로 다중 관계를 저장하기위한 것이고 두 번째 인수로 부울을 허용합니다 (분리 여부에 관계없이 기본값은 true 임).

이 경우 크기의 배열에 대해 foreach를 수행해야합니다. 각각의 값은 attach()이며, 부모 모델에 대한 값입니다. 이런 식으로 뭔가 :

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; 
} 

참고 : 복수로 이름을 경우 Laravel 알파벳 순서로 자동으로 피벗 테이블을 찾습니다. 따라서 피벗 테이블 products_sizes의 이름을 지정하면 다음과 같은 관계 메소드에서 테이블 이름을 생략 할 수 있습니다.

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