Обновить несколько столбцов - PullRequest
0 голосов
/ 22 февраля 2019

Я хочу обновить несколько product_variant одного продукта.В то же время я также обновляю название продукта.Я обновляю:

Product-> name
Product_variant(can be multiple)->name & price

Код, который я пробовал:

$product = Product::findOrFail($id);
$product->name = $request->product_name;
$product->update();
for ($i = 0; $i < count($request->variant_name); $i++) {
        $variant = ProductVariant::where('product_id',$id)->get();
       $variant->variant_name = $request->variant_name[$i];
       $variant->variant_price = $request->variant_price[$i];
       $variant->update();
 }

В поле зрения:

  <form action="{{ route('product.update',$product->id) }}" method="post">
    {{ method_field('PUT') }}
    {{ csrf_field() }}
    <label>{{ __('Product Name') }}</label>
    <input id="product_name" type="text" name="product_name" value="{{ $product->name }}" required autofocus>
    @foreach($product->product_variant as $variant)
            <label>{{ __('Variant') }}</label>
             <input id="product_name" type="text" name="variant_name[]" value=" 
                {{ $variant->variant_name }}" required autofocus>
              <input id="product_name" type="text" name="variant_price[]" value=" 
                {{ $variant->variant_price }}" required autofocus>
   @endforeach
      <button type="submit" class="rounded btn btn-primary">
              {{ __('Update') }}
       </button>                
  </form>

Ответы [ 4 ]

0 голосов
/ 22 февраля 2019

Попробуйте этот код:

$details = ProductVariant::where('product_id',$id)->get();

foreach ($details as $key => $detail) {
   $detail->variant_name = $request->get('variant_name')[$key];
   $detail->variant_price = $request->get('variant_price')[$key];
   $detail->save();
}

Надеюсь, это будет полезно.

Примечание: - Предполагая, что равное количество строк вариантов продукта и строк входных вариантов для определенного идентификатора.

Но я советую вам добавить уникальный variant labelстолбец в таблице Product Variants, для обновления значений по отношению к метке вариантов.

0 голосов
/ 22 февраля 2019

Вы вызываете коллекцию с помощью метода get () для eloquent, который возвращает массив данных, который называется функцией collection, и update () можно вызывать для одного объекта, а не для массива объектов.

for ($i = 0; $i < count($request->variant_name); $i++) {
    $variant = ProductVariant::where('product_id',$id)->get(); //here you are doing mistake change get() to first() then it should work
   $variant->variant_name = $request->variant_name[$i];
   $variant->variant_price = $request->variant_price[$i];
   $variant->update(); // change update function to save(); since update function requires array of data which you want to send to database in your case you are calling update function without sending any data.

}

Если вы хотите получить коллекцию и обновить каждую запись, выполните цикл этой коллекции и выполните свою логику, как показано ниже.

for ($i = 0; $i < count($request->variant_name); $i++) {
    $variant_collection = ProductVariant::where('product_id',$id)->get(); // it will return collection now you have to loop over to change each record.
    foreach($variant_collection as $variant_single_record){
       $variant_single_record->variant_name = $request->variant_name[$i];
       $variant_single_record->variant_price = $request->variant_price[$i];
       $variant_single_record->save();
   }
 }
0 голосов
/ 22 февраля 2019

В вашем цикле, когда вы получаете $ вариантов из базы данных, вы получаете коллекцию вашего ProductVariant (отношение один ко многим), и именно поэтому вы получаете ошибку «Метод Collection :: update не существует.».Laravel get () возвращает коллекцию ProductVariant.

Похоже, вы хотите обновить все product_variants, принадлежащие одному продукту, с тем же именем и ценой.Поэтому лучше, чтобы вы вывели product_variants за пределы цикла, а затем выполняли цикл по полученной коллекции.

$product = Product::findOrFail($id);
$product->name = $request->product_name;
$product->update();
$variants = ProductVariant::where('product_id',$id)->get(); // This return a collection of ProductVariant
foreach ($variants as $variant) {

    $variant->variant_name = $request->variant_name;
    $variant->variant_price = $request->variant_price;
    $variant->update();
}

Но, если вам нужно обновить варианты одного продукта с другими названиями и ценами, которые вы получаете по вашему запросу, сначала вам нужно изменить атрибут имени текстового ввода в html:

<input id="product_name" type="text" name="variant_name_{{$variant->id}}" value=" {{ $variant->variant_name }}" required autofocus>

<input id="product_name" type="text" name="variant_price_{{$variant->id}}" value=" {{ $variant->variant_price }}" required autofocus>

Тогда в вашем коде:

$product = Product::findOrFail($id);
$product->name = $request->product_name;
$product->update();
$variants = ProductVariant::where('product_id',$id)->get(); // This return a collection of ProductVariant
foreach ($variants as $variant) {

    $nameIdentifier = "variant_name_" . $variant->id;
    $priceIdentifier = "variant_price_" . $variant->id;
    $variant->variant_name = $request->$nameIdentifier;
    $variant->variant_price = $request->$priceIdentifier;
    $variant->update();
}

Кроме того, так как вы хотите, чтобы в вашем запросе был набор операций, я предпочитаю идти с транзакцией базы данных.В этом случае, если что-то пойдет не так во время операций, вы можете спокойно откатиться.https://laravel.com/docs/5.7/database#database-transactions

Надеюсь, это поможет:)

0 голосов
/ 22 февраля 2019

Попробуйте это:

Вам нужно использовать first () вместо get ()

$product = Product::findOrFail($id);
$product->name = $request->product_name;
$product->update();
for ($i = 0; $i < count($request->variant_name); $i++) {
       $variant = ProductVariant::where('product_id',$id)->first();
       $variant->variant_name = $request->variant_name[$i];
       $variant->variant_price = $request->variant_price[$i];
       $variant->save();
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...