обновить товарный запас по сводной таблице
В проекте магазина с 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());
}
}
}