Estoy tratando de crear un carrito de compras y quiero PUBLICAR múltiples campos con el mismo nombre y procesarlos

<?php foreach($datacart as $datacart) { ?>
<form method="post" action="/update-cart">

<input type="hidden" name="rowid" value="{{$datacart->rowid}}">
<input type="text" name="quantity" value="{{$datacart->quantity}}">

 <?php }>

<input type="submit" value="update">

</form>


public function update_cart(request $request){

   $rowId = $request->rowid;
   $quantity = $request->quantity;



   Cart::update($rowId, $quantity);

}

Primero muestra todos los productos usando un foreach. Entonces cada artículo tiene un rowid oculto y una cantidad.

El siguiente código muestra mi controlador. Pero con este código, solo actualiza un elemento (último). Pero quiero actualizar la cantidad de cada producto por separado

Olvidé mencionar que uso https://github.com/Crinsane/LaravelShoppingcart como complemento de mi carrito

0
Kelum Isuranga 11 may. 2019 a las 00:43

4 respuestas

La mejor respuesta

Gracias a todos. Este código funcionó para mí. yo solía bucle con un índice

<input type="hidden" name="rowid[]" value="{{$datacart->rowid}}">
<input type="text" name="quantity[]" value="{{$datacart->quantity}}">

,

 for ($i = 0; $i < count($request->input('rowid')); $i++){

            Cart::update($request->rowid[$i], $request->quantity[$i]);

        }
0
Kelum Isuranga 11 may. 2019 a las 14:34

Debe agregar [] después del nombre

<input type="hidden" name="rowid[]" value="{{$datacart->rowid}}">
<input type="text" name="quantity[]" value="{{$datacart->quantity}}">

Luego en su método de controlador

public function update_cart(Request $request) {
  for ($i = 0; $i < count($request->input('rowid')); $i++) {
    $cart = Cart::find($request->input('rowid')[$i];

    $cart->quantity = $request->input('quantity')[$i];
  }
}
0
John Aldrin 10 may. 2019 a las 21:52

Entonces, lo que debe hacer es definir en el marcado html que la entrada es una matriz como esta:

es decir usando corchetes [] al lado del nombre de los elementos de entrada

<?php foreach($datacart as $datacart) { ?>
<form method="post" action="/update-cart">

<input type="hidden" name="rowid[]" value="{{$datacart->rowid}}">
<input type="text" name="quantity[]" value="{{$datacart->quantity}}">

 <?php }>

<input type="submit" value="update">

</form>

Y luego, cuando maneja la solicitud en el método del controlador, debe procesarla así:

public function update_cart(request $request) {
    foreach ($request->rowid as $index => $rowid) {
        $quantity = $request->quantity[$index];
        Cart::where('id', $rowId)
            ->update([
                'quantity' => $quantity
            ]);
    }
}
0
Latheesan 10 may. 2019 a las 21:57

Primero, vamos a mejorar su archivo Blade, puede usar la sintaxis de Blade en lugar de PHP, así que aquí:

<form method="post" action="/update-cart">
    @csrf

    @foreach($datacart as $datacart)
        <input type="hidden" name="rowid[]" value="{{$datacart->rowid}}">
        <input type="text" name="quantity[]" value="{{$datacart->quantity}}">
    @endforeach

    <input type="submit" value="update">
</form>

Observe que los atributos de nombre de los elementos de entrada ahora aceptan múltiples valores como una matriz. Luego, para procesarlo en su controlador, puede hacer lo siguiente:

public function update_cart(Request $request) {

    foreach ( $request->rowid as $index => $id ) {
       Cart::find($id)->update(['quantity' => $request->quantity[$index]]);
    }

}

-- EDITAR

Acabo de probar llamando al update en el modelo ya que el método estático no funcionará.

1
nakov 10 may. 2019 a las 22:03