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:
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
$request->input('cart_items')
dar la matriz de todos los productos añadidos al carritoY 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
yprice
columna sobrecart_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