обновить товарный запас по сводной таблице

В проекте магазина с Laravel я написал корзину сам, но в части, которая возвращается из банка после оплаты, я не могу вычесть из модели товара количество отдельных купленных товаров. Проблема в том, что цикл OrderController Foreach возвращает только одну запись из корзины, например, если у меня в корзине 4 разных товара, у меня есть доступ только к первой записи, или мне приходится вручную добавлять значения в массив. Пожалуйста помоги

Модели продуктов

         Schema::create('products', function (Blueprint $table) {
        $table->id();
        $table->string('title')->nullable();
        $table->string('description')->nullable();
        $table->integer('price')->nullable();
        $table->string('image'); // for blob$table->string('subcategory');
        $table->integer('inventory')->nullable();
        $table->timestamps();
        
    });

Модельные заказы

                  $table->id();
            $table->unsignedBigInteger('user_id');
            $table->foreign('user_id')->on('users')->references('id')->onDelete('cascade');
            $table->unsignedBigInteger('product_id')->nullable();
            $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade')->default(' none');
            $table->integer('count');
            $table->integer('price');
            $table->string('address')->nullable();
            $table->string('t_id')->nullable();
            $table->string('ref_id')->nullable();
            $table->string('status')->default('none');


            $table->timestamps();
        });

Сводная таблица Order_product

                  $table->id();

            $table->unsignedBigInteger('order_id');
            $table->foreign('order_id')->references('id')->on('orders')->onDelete('cascade');
            $table->unsignedBigInteger('product_id');
            $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade')->default('none ');
            $table->unsignedBigInteger('count');
            $table->unsignedBigInteger('price');
            $table->string('product_title');
            

        });


Корзина.php

      <?php

namespace App\Models;

use App\Models\Product;
use App\Models\Order;

class Cart
{
    public $products = [];
    public $count = null;
    public $price = 0;
    public $address = null;

    public function __construct($Cart)

    {
        if (!is_null($Cart)) {
            $this->products = $Cart->products;
            $this->count = $Cart->count;
            $this->price = $Cart->price;
            $this->address = $Cart->address;
        }
    }
    public function AddToCart($products)
    {
        // $this->id = Product ::find($products->id= null);


        if (array_key_exists($products->id , $this->products)) {
            $this->products[$products->id] = [
                "products" => $products,
                "count" => $this->products[$products->id]['count'] + 1,
            ];
        } else {
            $this->products[$products->id] = [
                "products" => $products,
                "count" => 1,


            ];
        }
        $this->price += $products->price;
        $this->count +=  1;
    }
    public function removeCart($products){
        if (!array_key_exists($products->id , $this->products))
        return false;
        $count= $this->products[$products->id]['count'];
        $this->price -= $products->price * $count;

        $this->count -= - $count;
        unset($this->products[$products->id]);
        


    }
}

OrderController.php

      <?php

namespace App\Http\Controllers\Site;

use App\Models\Cart;
use App\Models\Product;
use App\Http\Controllers\Controller;
use App\Models\Financial;
use App\Models\Order;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Models\User;
use App\Models\Relations\OrderRelations;
use App\Models\Relations\UserRelations;
use Cryptommer\Smsir\SmsirServiceProvider;
use FFI;
use Shetabit\Multipay\Invoice;
use Shetabit\Payment\Facade\Payment;
use Shetabit\Multipay\Exceptions\InvalidPaymentException;
use function PHPUnit\Framework\isNull;
use Cryptommer\Smsir\Smsir;
use Illuminate\Support\Facades\DB;
use PhpParser\Node\Expr\Cast\Array_;
use Symfony\Component\Finder\Finder;

class OrderController extends Controller
{
    public $send;
    public function addToCart(Product $product, Request $request)
    {
        $oldCart = $request->session()->has("cart") ? $request->session()->get("cart") : null;
        $cart = new Cart($oldCart);
        $cart->addToCart($product);
        $request->session()->put("cart", $cart);
        return view('Site.Order.Cart', compact(
            'cart'
        ));
    }
    public function removeCart(Product $product, Request $request)
    {
        $oldCart = $request->session()->has("cart") ? $request->session()->get("cart") : null;
        $cart = new Cart($oldCart);
        $cart->removeCart($product, $cart);
        $request->session()->forget('cart');
        return redirect()->route('CartShow');
    }
    public function cartshow(Request $request)
    {
        $oldCart = $request->session()->has("cart") ? $request->session()->get("cart") : null;
        $cart = new Cart($oldCart);
        return view('Site.Order.Cart', compact(
            'cart'
        ));
    }
    public function delSession(Request $request)
    {
        // $request->session()->forget('key');
        // $request->session()->put('key', $request);
    }
    public function invoicesend(Request $request)
    {
        $oldCart = $request->session()->has("cart") ? $request->session()->get("cart") : null;
        $cart = new Cart($oldCart);
        $order = auth()->user()->order()->create([
            'count' => $cart->count,
            'price' => $cart->price,

        ]);
        foreach ($cart->products as $item) {
            $product = $item['products'];
            $order->product()->attach([
                $product->id => [
                    'product_id' => $item['products']->id,
                    'count' => $item['count'],
                    'price' => $item['products']->price,
                    'product_title' => $item['products']->title,

                ]

            ]);
        }
        // Create new invoice.
        $invoice = new Invoice;

        // Set invoice amount.
        $invoice->amount($order->price);
        return Payment::callbackUrl(route('PayBack'))->purchase(
            $invoice,
            function ($driver, $transactionId) use ($order, $product, $cart) {
                // We can store $transactionId in database.
                $order->update([
                    't_id' => $transactionId
                ]);
                // PAyBack section
















                $finan = new Financial();
                $finan->order_id = $order->id;
                $finan->price = $order->price;
                $finan->status = 'پرداخت موفق';
                $finan->save();
            }

        )->pay()->render();;
    }
    public function PayBack(Product $product, Request $request)
    {
        $transaction_id = $request->Authority;
        $order = Order::where('t_id', $transaction_id)->first();


        try {
            $receipt = Payment::amount($order->price)->transactionId($transaction_id)->verify();
            $order->Update([
                'ref_id' => $receipt->getReferenceId(),
                'status' => 'پرداخت موفق',
            ]);
            if ($order->Update([
                'ref_id' => $receipt->getReferenceId(),
                'status' => 'پرداخت موفق',
            ]))









                $v = verta();
            $ref = $receipt->getReferenceId();
            $oldCart = $request->session()->has("cart") ? $request->session()->get("cart") : null;
            $request->session()->forget('oldCart');
            $oldCart = $request->session()->has("cart") ? $request->session()->get("cart") : null;
            $cart = new Cart($oldCart);
            $cart->removeCart($product, $cart);
            $request->session()->forget('cart', $cart);

            $tx = $transaction_id;






            return view('Site.Order.PayBack',  compact('tx', 'cart', 'ref', 'v'));

            // You can show payment referenceId to the user.

        } catch (InvalidPaymentException $exception) {

            dd($exception->getMessage());
        }
    }
}


0 ответов

Другие вопросы по тегам