Сохранение Laravel показывает true, но в базе данных ничего нет

#php #laravel #save

Вопрос:

Я знаю, что этот вопрос повторяется, но опробование нескольких ответов на эти вопросы ничего для меня не дало.

Короче говоря, у меня есть этот метод хранения:

 public function store(Request $request)
{
    $selected_products = json_decode($request->selectedproducts);

    $cart = new Cart();
    
    $cartprods = CartProd::hydrate( $selected_products );

    // This sums all the end costs to get a total cost
    // And saves the cart so that its id is not null
    $final_cost = 0;
    foreach ($cartprods as $prod) {
        $final_cost  = $prod->cost;
    }
    $cart->cost = $final_cost;
    $cart->user_id = Auth::user()->id;
    $cart->save();

    foreach ($cartprods as $prod) {
        $prod->cart_id = $cart->id;
        $og_product = Product::FindOrFail($prod->product_id);
        $og_product->amount -= $prod->amount;
        $og_product->save();
        $prod->save();
        dd($prod->save());
    }
    
    return redirect()->route('cart');
}
 

Выполнение dd выше показывает истину, но вход в мою базу данных и выполнение select * говорит, что это пустой набор.

Вот моя модель CartProd:

 <?php

namespace AppModels;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;

class CartProd extends Model
{
use HasFactory;

protected $table = 'cartprod';
protected $primaryKey = 'id';
protected $fillable = [
    'unit_price',
    'amount',
    'discount',
    'cost',
    'cart_id',
    'product_id',
];

public function cart()
{
    return $this->belongsTo(Cart::class, 'cart_id');
}

public function product()
{
    return $this->belongsTo(Product::class, 'product_id');
}
}
 

И просто потому, что это может быть полезно, это команды для переноса таблицы (они находятся в их собственном файле миграции, так что там нет никаких проблем).:

 Schema::create('cartprod', function (Blueprint $table) {
    $table->id();
    $table->decimal('unit_price',9,2);
    $table->integer('amount');
    $table->integer('discount');
    $table->decimal('total_cost',9,2);
    $table->timestamps();
});
Schema::table('cartprod', function (Blueprint $table) {
    $table->foreignId('cart_id')->references('id')->on('cart');
});
Schema::table('cartprod', function (Blueprint $table) {
    $table->foreignId('product_id')->references('id')->on('product');
});
 

Поискав ответ, я нашел несколько других, которые мне не помогли, например, $PrimaryKey, соответствующий имени в базе данных (это так), или другие, которые не соответствовали моей модели. Большое спасибо за вашу помощь!

Комментарии:

1. Можем ли мы посмотреть, что в вашей $request->selectedproducts функции вы отправляете в магазин?

2. @Lyzvaleska я приношу извинения за то, что так долго не отвечал!! $запрос->выбранные товары отправляет массив товаров для покупки. Например: [{«unit_price»:5,»amount»:4,»discount»:0.95,»cost»:19,»cart_id»:null,»product_id»:1,»product»:{«id»:1,»name»:»Sticker»,»amount»:7,»price»:»5.00″,»created_at»:»2021-09-14T00:37:09.000000Z»,»updated_at»:»2021-09-14T23:33:07.000000Z»}},{«unit_price»:10,»amount»:1,»discount»:1,»cost»:10,»cart_id»:null,»product_id»:2,»product»:{«id»:2,»name»:»Pencil»,»amount»:5,»price»:»10.00″,»created_at»:»2021-09-14T00:37:09.000000Z»,»updated_at»:»2021-09-14T23:24:05.000000Z»}}]

3. Если вы добавите в корзину 4 стикера со скидкой 5% и карандаш без скидки, они будут отправлены в массиве, и его метод json_decode преобразует его из json в соответствующий массив, а затем CartProd::превратит его в коллекцию продуктов cartprod.

4. Вы пробовали заполнить свою модель традиционным способом вместо гидратора? Я должен признать , что я никогда не сталкивался ::hydrate() , и я не вижу ничего, что могло бы быть ошибкой в вашем коде.

5. @Lyzvaleska Вы были абсолютно правы! Я тоже никогда раньше не встречал функцию гидратации, и я думал, что это сэкономит мне некоторое время, но, похоже, ничто не сравнится с хорошим старомодным циклом foreach!

Ответ №1:

Спасибо @Lyzvaleska за предложение! Оказывается, проблема заключалась в функции гидрата, поэтому все, что мне нужно было сделать, это заменить ее и создать каждый продукт с помощью foreach как таковой:

 public function store(Request $request)
{
    $selected_products = json_decode($request->selectedproducts);

    $cartprods = array();
    $final_cost = 0;
    foreach ($selected_products as $prod) {
        $final_cost  = $prod->total_cost;
        $selProd = new CartProd();
        $selProd->unit_price = $prod->unit_price;
        $selProd->amount = $prod->amount;
        $selProd->discount = $prod->discount;
        $selProd->total_cost = $prod->total_cost;
        $selProd->cart_id = $prod->cart_id;
        $selProd->product_id = $prod->product_id;
        array_push($cartprods, $selProd);
    }

    $cart = new Cart();
    $cart->cost = $final_cost;
    $cart->user_id = Auth::user()->id;
    $cart->save();

    foreach ($cartprods as $prod) {
        $prod->cart_id = $cart->id;
        $og_product = Product::FindOrFail($prod->product_id);
        $og_product->amount -= $prod->amount;
        $og_product->save();
        $prod->save();
    }
    
    return redirect()->route('cart');
}