Add product quantities
This commit is contained in:
parent
6b34c59d73
commit
9fcdd131c8
9 changed files with 83 additions and 19 deletions
1
.envrc
1
.envrc
|
@ -1 +1,2 @@
|
||||||
use nix
|
use nix
|
||||||
|
layout php
|
||||||
|
|
|
@ -27,10 +27,19 @@ class CartController extends Controller
|
||||||
return view("cart", ["user" => $user]);
|
return view("cart", ["user" => $user]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addToCart(Product $product)
|
public function addToCart(Product $product, Request $request)
|
||||||
{
|
{
|
||||||
$user = Auth::user();
|
$user = Auth::user();
|
||||||
$user->cart()->syncWithoutDetaching([$product->uuid]);
|
$user->cart()->syncWithoutDetaching([$product->uuid]);
|
||||||
|
$quantity = $request->validate([
|
||||||
|
'quantity' => 'numeric|min:1'
|
||||||
|
])["quantity"];
|
||||||
|
|
||||||
|
if($quantity) {
|
||||||
|
$pivot = $user->cart()->findOrFail($product->uuid)->pivot;
|
||||||
|
$pivot->quantity = $quantity;
|
||||||
|
$pivot->save();
|
||||||
|
}
|
||||||
|
|
||||||
return back();
|
return back();
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,10 +37,12 @@ class OrderController extends Controller
|
||||||
{
|
{
|
||||||
$validated = $request->validate([
|
$validated = $request->validate([
|
||||||
'products' => 'required|array',
|
'products' => 'required|array',
|
||||||
'products.*' => 'exists:products,uuid'
|
'products.*' => 'exists:products,uuid',
|
||||||
|
'product_quantities' => 'required|array',
|
||||||
|
'product_quantities.*' => 'numeric|min:1',
|
||||||
]);
|
]);
|
||||||
$products = array_map(fn ($v) => Product::query()->where("uuid", $v)->first(), $validated["products"]);
|
$products_quantities = array_map(fn ($v, $q) => [Product::query()->where("uuid", $v)->first(), $q], $validated["products"], $validated["product_quantities"]);
|
||||||
return view("order/create", ["products" => $products]);
|
return view("order/create", ["products_with_quantities" => $products_quantities]);
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,11 +62,13 @@ class OrderController extends Controller
|
||||||
$validated = $request->validate([
|
$validated = $request->validate([
|
||||||
'products' => 'required|array',
|
'products' => 'required|array',
|
||||||
'products.*' => 'exists:products,uuid',
|
'products.*' => 'exists:products,uuid',
|
||||||
|
'product_quantities' => 'required|array',
|
||||||
|
'product_quantities.*' => 'numeric|min:1',
|
||||||
'address' => 'required',
|
'address' => 'required',
|
||||||
]);
|
]);
|
||||||
|
$products_quantities = array_map(fn ($v, $q) => [Product::query()->where("uuid", $v)->first(), $q], $validated["products"], $validated["product_quantities"]);
|
||||||
|
|
||||||
$products = array_map(fn ($v) => Product::query()->where("uuid", $v)->first(), $validated["products"]);
|
DB::transaction(function () use ($validated, $user, $products_quantities) {
|
||||||
DB::transaction(function () use ($validated, $user, $products) {
|
|
||||||
$address = new Address($validated);
|
$address = new Address($validated);
|
||||||
$address->user()->associate($user);
|
$address->user()->associate($user);
|
||||||
$address->save();
|
$address->save();
|
||||||
|
@ -73,16 +77,20 @@ class OrderController extends Controller
|
||||||
|
|
||||||
$order->address()->associate($address);
|
$order->address()->associate($address);
|
||||||
$order->user()->associate($user);
|
$order->user()->associate($user);
|
||||||
$order->cost = array_reduce($products, fn ($c, $i) => bcadd($c,$i->price), 0);
|
$order->cost = array_reduce($products_quantities, fn ($c, $i) => bcadd($c,bcmul($i[0]->price,$i[1])), 0);
|
||||||
|
|
||||||
$order->save();
|
$order->save();
|
||||||
foreach($products as $product) {
|
foreach($products_quantities as $product_quantity) {
|
||||||
|
$product = $product_quantity[0];
|
||||||
|
$quantity = $product_quantity[1];
|
||||||
$order->products()->attach($product);
|
$order->products()->attach($product);
|
||||||
|
$order->products()->find($product->uuid)->pivot->quantity = $quantity;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
foreach($products as $product) {
|
foreach($products_quantities as $product) {
|
||||||
$user->cart()->detach($product);
|
$user->cart()->detach($product[0]);
|
||||||
}
|
}
|
||||||
|
return redirect()->route("order.index");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -23,6 +23,6 @@ class Order extends Model
|
||||||
|
|
||||||
public function products()
|
public function products()
|
||||||
{
|
{
|
||||||
return $this->belongsToMany(Product::class, "orderProduct", "orderId" ,"productId");
|
return $this->belongsToMany(Product::class, "orderProduct", "orderId" ,"productId")->withPivot("quantity");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,7 +52,7 @@ class User extends Authenticatable
|
||||||
|
|
||||||
public function cart()
|
public function cart()
|
||||||
{
|
{
|
||||||
return $this->belongsToMany(Product::class, "cart_items", "userID", "productID");
|
return $this->belongsToMany(Product::class, "cart_items", "userID", "productID")->withPivot("quantity");
|
||||||
}
|
}
|
||||||
|
|
||||||
public function orders()
|
public function orders()
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
class AddCartItemQuantity extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::table('cart_items', function (Blueprint $table) {
|
||||||
|
$table->unsignedInteger("quantity")->default(1);
|
||||||
|
});
|
||||||
|
Schema::table('orderProduct', function (Blueprint $table) {
|
||||||
|
$table->unsignedInteger("quantity")->default(1);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
Schema::table('cart_items', function (Blueprint $table) {
|
||||||
|
$table->dropColumn("quantity");
|
||||||
|
});
|
||||||
|
Schema::table('orderProduct', function (Blueprint $table) {
|
||||||
|
$table->dropColumn("quantity");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -12,9 +12,17 @@
|
||||||
<div>
|
<div>
|
||||||
<div class="cart-items">
|
<div class="cart-items">
|
||||||
@foreach($user->cart as $product)
|
@foreach($user->cart as $product)
|
||||||
|
{{-- dd($product->pivot->quantity) --}}
|
||||||
<div class="cart-item">
|
<div class="cart-item">
|
||||||
<x-product :product="$product" />
|
<x-product :product="$product" />
|
||||||
|
<form method="POST" action="{{route("addToCart",$product)}}">
|
||||||
|
<input type="number" value="{{ $product->pivot->quantity }}" name="quantity">
|
||||||
|
<button type="submit"> Zatwierdź </button>
|
||||||
|
@csrf
|
||||||
|
|
||||||
|
</form>
|
||||||
<form class="remove-cart-form" action="{{ route("removeFromCart", $product) }}" method="post">
|
<form class="remove-cart-form" action="{{ route("removeFromCart", $product) }}" method="post">
|
||||||
|
|
||||||
@csrf
|
@csrf
|
||||||
<button type="submit"> Remove from cart </button>
|
<button type="submit"> Remove from cart </button>
|
||||||
</form>
|
</form>
|
||||||
|
@ -26,6 +34,7 @@
|
||||||
@csrf
|
@csrf
|
||||||
@foreach($user->cart as $product)
|
@foreach($user->cart as $product)
|
||||||
<input type="hidden" name="products[{{ $loop->index }}]" value="{{ $product->uuid }}">
|
<input type="hidden" name="products[{{ $loop->index }}]" value="{{ $product->uuid }}">
|
||||||
|
<input type="hidden" name="product_quantities[{{ $loop->index }}]" value="{{ $product->pivot->quantity }}">
|
||||||
@endforeach()
|
@endforeach()
|
||||||
<button type="submit"> Order </button>
|
<button type="submit"> Order </button>
|
||||||
</form>
|
</form>
|
||||||
|
|
|
@ -15,9 +15,10 @@
|
||||||
@endif
|
@endif
|
||||||
<div>
|
<div>
|
||||||
<form method="post" action="{{ route("order.store") }}">
|
<form method="post" action="{{ route("order.store") }}">
|
||||||
@foreach($products as $product)
|
@foreach($products_with_quantities as $product)
|
||||||
<input type="hidden" name="products[{{ $loop->index }}]" value="{{ $product->uuid }}">
|
<input type="hidden" name="products[{{ $loop->index }}]" value="{{ $product[0]->uuid }}">
|
||||||
<x-product :product="$product" />
|
<x-product :product="$product[0]"/>
|
||||||
|
<input type="number" name="product_quantities[{{ $loop->index }}]" value="{{ $product[1] }}">
|
||||||
@endforeach
|
@endforeach
|
||||||
|
|
||||||
<textarea name="address"></textarea>
|
<textarea name="address"></textarea>
|
||||||
|
|
|
@ -9,8 +9,6 @@
|
||||||
@section('main')
|
@section('main')
|
||||||
<p>
|
<p>
|
||||||
<b>Welcome, you are logged in as {{ $user->name }}</b>
|
<b>Welcome, you are logged in as {{ $user->name }}</b>
|
||||||
</p>
|
<a href="{{route("logout")}}"> Logout </a>
|
||||||
<p>
|
|
||||||
<a href="/logout"> Logout </a>
|
|
||||||
</p>
|
</p>
|
||||||
@endsection()
|
@endsection()
|
||||||
|
|
Loading…
Reference in a new issue