0
votes

Mettre à jour plusieurs colonnes

Je souhaite mettre à jour plusieurs product_variant d'un produit. En même temps, je mets également à jour le nom du produit. Ce que je mets à jour est:

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

Code que j'ai essayé:

$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();
 }

En vue:

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


10 commentaires

Alors, quel est le problème ou une erreur se produit?


Obtention de cette erreur, BadMethodCallException {# 280 ▼ #message: "La méthode Illuminate \ Database \ Eloquent \ Collection :: update n'existe pas."


problème apparaît lorsque je mets à jour product_variants.


Et vous avez le même nom pour les variantes d'entrée pour le nom et le prix. Veuillez le changer


toujours une erreur


Veuillez partager votre table de produits et de variantes de base de données. Je pense que le problème est dans la boucle


Étant donné que le produit a de nombreuses variantes et que lorsque vous obtenez les variantes se trouvent dans la boucle for, la variable $ variants récupère les collections


oui, je pense aussi que ce problème est en boucle mais je ne transmets pas l'identifiant des variantes.


Hé, partage tes tables de base de données, je pense que je peux résoudre ton problème


check op j'ai édité


5 Réponses :


0
votes

Essaye celui-là:

Vous devez utiliser first () au lieu de 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();
 }


0 commentaires

0
votes

Vous appelez la collection en utilisant la méthode get () sur eloquent qui renvoie un tableau de données appelé collection et la fonction update () peut être appelée sur un seul objet et non sur un tableau d'objets.

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

}

Si vous souhaitez obtenir une collection et mettre à jour chaque enregistrement, bouclez cette collection et faites votre logique comme indiqué ci-dessous.

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.


0 commentaires

1
votes

Dans votre boucle, lorsque vous obtenez $ variants de la base de données, vous obtenez une collection de votre ProductVariant (relation un à plusieurs), et c'est la raison pour laquelle vous obtenez l'erreur "Method Collection :: update does not exist.". Laravel get () renvoie une collection de ProductVariant.

Il semble que vous souhaitiez mettre à jour tous les produits_variants appartenant à un seul produit avec le même nom et le même prix. Il est donc préférable que vous obteniez les variables product_variants en dehors de la boucle, puis que vous fassiez votre boucle à travers la collection que vous obtenez.

$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();
}

Mais, si vous avez besoin de mettre à jour les variantes d'un produit avec des noms et des prix différents que vous obtenez de votre demande, vous devez d'abord modifier l'attribut de nom des entrées de texte dans votre 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>

Puis dans votre code:

$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();
}

De plus, puisque vous souhaitez un ensemble d'opérations dans votre demande, je préfère utiliser la transaction de base de données. Dans ce cas, si quelque chose ne va pas pendant les opérations, vous pouvez revenir en arrière en toute sécurité. https://laravel.com/docs/5.7/database#database-transactions

J'espère que cela aide :)


4 commentaires

merci mais toujours une erreur QueryException {# 276 ▼ #sql: "update product_variants set variant_name =?, variant_price =?, updated_at =? where id =?" #bindings: array: 4 [▼ 0 => array: 18 [▶] 1 => array: 18 [▶] 2 => "2019-02-22 11:40:03" 3 => 1] #message: " Conversion de tableau en chaîne (SQL: update product_variants set variant_name = Catch up, variant_price = 12, updated_at = 2019-02-22 11:40:03 where id = 1) "


Mettez-vous à jour chaque product_variant avec un nom et un prix différents?


Ouais, c'est parce que votre requête renvoie un tableau. Désolé, je pensais que vous souhaitiez mettre à jour toutes les variantes avec le même nom, le même prix. Je vais mettre à jour ma réponse maintenant


@Namoshek, vient de mettre à jour ma réponse en ajoutant un nom unique pour chaque product_variant dans le html, afin que vous puissiez mettre à jour chaque product_variant avec son nom spécifique provenant du formulaire html. J'espère que cela aide. :)



0
votes

Essayez ce code:

$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();
}

J'espère que ce serait utile.

Remarque: - En supposant que le nombre égal de lignes de variantes de produit et les lignes de variantes d'entrée par rapport à un identifiant spécifique.

Mais je vous conseille d'ajouter une colonne d' variant label unique dans le tableau Product Variants , pour mettre à jour les valeurs par rapport à l'étiquette des variantes.


4 commentaires

parfait. Merci. Même ce que j'essaye en ce moment. Merci encore. Pouvez-vous m'expliquer, je comprends ce que vous faites mais je veux comprendre précisément


Bienvenue bro ... Simplement, je reçois d'abord les collections par rapport à product_id et foreach collections. nombre égal.


quelle signification de cela Mais je vous conseille d'ajouter une colonne d'étiquette de variante unique dans le tableau Variantes de produit, pour mettre à jour les valeurs par rapport à l'étiquette des variantes.


Cela signifie que dans le code ci-dessus, vous devez simplement mettre à jour les données à l'aide de la boucle, mais si une colonne unique est ajoutée dans le tableau des variantes de produit, vous pouvez mettre à jour les données par rapport à cette colonne avec précision. C'est une meilleure approche.



0
votes

Essaye ça,

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

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


0 commentaires