Estoy tratando de guardar en db múltiples registros con un formulario, pero tengo este error: Array to string conversion

Traté de guardar registros de múltiples productos en una tabla, en una base de datos, con un solo formulario pero, hay este error y no sé que hacer calor para resolverlo.

Error: Array a la conversión de cadena

en el vendedor\laravel\framework\src\Illuminate\Support\Str

   $result .= (array_shift($replace) ?? $search).$segment;

Datatype of 'reference' and 'quantity' is string.

Esta es la vista:

@csrf @foreach(session('cart') as $id => $details)
@endforeach

Este es el controlador:

    public function store(Request $request)
    {   
        $cart = new Cart;
        $data = [
            'reference' => $request->reference,
            'quantity' => $request->quantity
        ];
        $cart->fill($data);
        $cart->save();

        return view('riepilogo');
    }

Cuando haga clic en el botón "productos añadidos" sólo los últimos registros se guardan en la tabla

class Cart extends Model
{
    protected $fillable = ['id', 'reference', 'pdv_code', 'quantity'];

    public $timestamps = false;

    public function product()
    {

        return $this->belongsToMany('App\Product');
    }    
}
class Product extends Model
{
    protected $fillable = ['ean', 'reference', 'product_price', 'pdv_code'];

    public $timestamps = false;

    public function detail() 
    {
        return $this->belongsTo('App\Products_detail');
    }

    public function cart()
    {
        return $this->belongsToMany('App\Cart');
    }
}


> Blockquote

Migración:

    public function up()
    {
        Schema::create('cart_product', function (Blueprint $table) {

            $table->unsignedBigInteger('cart_id');
            $table->foreign('cart_id')
                ->references('id')
                ->on('carts')
                ->onDelete('cascade');

            $table->unsignedBigInteger('product_id');
            $table->foreign('product_id')
                ->references('id')
                ->on('products')
                ->onDelete('cascade');

            $table->primary(['cart_id', 'product_id']);
        });
    }

    public function down()
    {
        Schema::dropIfExists('cart_product');
    }

Carrito de migración:

    public function up()
    {
        Schema::create('carts', function (Blueprint $table) {
            $table->id();
            $table->char('reference');
            $table->integer('quantity');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('carts');
    }
public function addToCart(Request $request, $id, $reference)
{
    $product = Product::find($id)->where('reference', $reference)->first();

    if(!$product) {

        abort(404);

    }
    
    $cart = session()->get('cart');

    // if cart is empty then this the first product
    if(!$cart) {

        $cart = [
                $id => [
                    "id" => $product->id,
                    "quantity" => 1,
                    "price" => $product->product_price,
                    "ean" => $product->ean,
                    "reference" => $product->reference
                ]
        ];
        //dd($cart);

        session()->put('cart', $cart);

        return back()->with('success', 'Product added to cart successfully!');
    }

    // if cart not empty then check if this product exist then increment quantity
    if(isset($cart[$id])) {

        $cart[$id]['quantity']++;

        session()->put('cart', $cart);

        return back()->with('success', 'Product added to cart successfully!');

    }

    // if item not exist in cart then add to cart with quantity = 1
    $cart[$id] = [
        "id" => $product->id,
        "quantity" => 1,
        "price" => $product->product_price,
        "ean" => $product->ean,
        'reference' => $product->reference
    ];

    session()->put('cart', $cart);

    return back()->with('success', 'Product added to cart successfully!');
}

Pregunta hecha hace 3 años, 4 meses, 28 días - Por codemasterx


3 Respuestas:

  • Su formulario debe tener una referencia al carrito a través del id para ambos campos de entrada

    @csrf @foreach(session('cart') as $id => $details)
    @endforeach

    $request->input('cart_items') dar la matriz de todos los productos añadidos al carrito

    Y necesitas otro modelo CartItem y mesa cart_items para almacenar los artículos de línea para el carrito donde cada línea puede tener un producto_id y cantidad por lo menos.

    O puedes añadir quantity y price columna sobre cart_product Mesa central.

    Para la tabla de carritos: puede tener columnas: total, tax etc las columnas de referencia y cantidad del producto no pueden estar en la tabla de carritos su uso - un carrito puede tener 3 productos añadidos por ejemplo a él [Camiseta: 1, Trouser: 2, Hoodie: 1] ahora que referencia y la cantidad de producto se almacenará en la tabla de carritos?

    En su lugar puede haber tres registros para cart_items table

    Camiseta- título, cantidad, cart_id

    Trouser-id, cantidad, cart_id

    Hoodie- títuloid, cantidad, cart_id

    Respondida el Dec 18, 2020 a las 14:17 - por codechampion

    Votos positivos: 0 | Votos negativos: 0

  • El error "Array to string conversion" que estás experimentando se debe a que estás tratando de asignar un array a campos en la base de datos que esperan datos de tipo string. En este caso, estás intentando guardar múltiples registros en la base de datos, pero estás pasando arrays en los campos 'reference' y 'quantity' en tu controlador.

    Para solucionar este problema, puedes iterar sobre los datos que recibes en tu controlador y guardar cada registro por separado. Aquí te muestro cómo podrías modificar tu controlador:

    php
    public function store(Request $request)
    {   
        foreach ($request->reference as $key => $reference) {
            $cart = new Cart;
            $cart->reference = $reference;
            $cart->quantity = $request->quantity[$key];
            $cart->save();
        }
    
        return view('riepilogo');
    }
    

    En este código, recorremos los arrays 'reference' y 'quantity' para guardar cada registro por separado en la base de datos.

    Además, asegúrate de que estás recibiendo los datos correctos en tu formulario y de que los nombres de los campos coinciden con los que estás utilizando en tu controlador.

    Espero que esta solución te ayude a resolver el error y puedas guardar múltiples registros correctamente en tu base de datos. ¡Déjame saber si tienes alguna otra pregunta!

    Respondida el Dec 19, 2020 a las 14:17 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error "Array to string conversion" ocurre cuando intentas concatenar un array con una string. En tu caso, estás intentando concatenar el array $request->reference con una string en la línea:

    php
    $data = [
        'reference' => $request->reference,
        'quantity' => $request->quantity
    ];
    

    Para resolver este problema, puedes convertir el array $request->reference a una string uniendo sus elementos con una coma:

    php
    $data = [
        'reference' => implode(', ', $request->reference),
        'quantity' => $request->quantity
    ];
    

    También puedes usar la función array_map() para aplicar una función a cada elemento del array y convertirlo a una string:

    php
    $data = [
        'reference' => array_map('strval', $request->reference),
        'quantity' => $request->quantity
    ];
    

    Recuerda que también debes asegurarte de que los valores en $request->quantity son números enteros, ya que el error también puede ocurrir si intentas concatenar una string con un número.

    Respondida el Dec 19, 2020 a las 14:24 - por Gemini

    Votos positivos: 0 | Votos negativos: 0