diff --git a/.envrc b/.envrc index 1d953f4..f1332ba 100644 --- a/.envrc +++ b/.envrc @@ -1 +1,2 @@ use nix +layout php diff --git a/app/Http/Controllers/CartController.php b/app/Http/Controllers/CartController.php index 5d8ff33..2033b45 100644 --- a/app/Http/Controllers/CartController.php +++ b/app/Http/Controllers/CartController.php @@ -27,10 +27,19 @@ class CartController extends Controller return view("cart", ["user" => $user]); } - public function addToCart(Product $product) + public function addToCart(Product $product, Request $request) { $user = Auth::user(); $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(); } diff --git a/app/Http/Controllers/OrderController.php b/app/Http/Controllers/OrderController.php index 2c6a925..38ab4ca 100644 --- a/app/Http/Controllers/OrderController.php +++ b/app/Http/Controllers/OrderController.php @@ -37,10 +37,12 @@ class OrderController extends Controller { $validated = $request->validate([ '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"]); - return view("order/create", ["products" => $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_with_quantities" => $products_quantities]); // } @@ -60,11 +62,13 @@ class OrderController extends Controller $validated = $request->validate([ 'products' => 'required|array', 'products.*' => 'exists:products,uuid', + 'product_quantities' => 'required|array', + 'product_quantities.*' => 'numeric|min:1', '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) { + DB::transaction(function () use ($validated, $user, $products_quantities) { $address = new Address($validated); $address->user()->associate($user); $address->save(); @@ -73,16 +77,20 @@ class OrderController extends Controller $order->address()->associate($address); $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(); - foreach($products as $product) { + foreach($products_quantities as $product_quantity) { + $product = $product_quantity[0]; + $quantity = $product_quantity[1]; $order->products()->attach($product); + $order->products()->find($product->uuid)->pivot->quantity = $quantity; } }); - foreach($products as $product) { - $user->cart()->detach($product); + foreach($products_quantities as $product) { + $user->cart()->detach($product[0]); } + return redirect()->route("order.index"); } /** diff --git a/app/Models/Order.php b/app/Models/Order.php index a525ad8..676e408 100644 --- a/app/Models/Order.php +++ b/app/Models/Order.php @@ -23,6 +23,6 @@ class Order extends Model public function products() { - return $this->belongsToMany(Product::class, "orderProduct", "orderId" ,"productId"); + return $this->belongsToMany(Product::class, "orderProduct", "orderId" ,"productId")->withPivot("quantity"); } } diff --git a/app/Models/User.php b/app/Models/User.php index a0d4446..255d67e 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -52,7 +52,7 @@ class User extends Authenticatable 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() diff --git a/database/migrations/2021_12_14_153612_add_cart_item_quantity.php b/database/migrations/2021_12_14_153612_add_cart_item_quantity.php new file mode 100644 index 0000000..3b01d51 --- /dev/null +++ b/database/migrations/2021_12_14_153612_add_cart_item_quantity.php @@ -0,0 +1,38 @@ +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"); + }); + } +} diff --git a/resources/views/cart.blade.php b/resources/views/cart.blade.php index 0aab0a0..b3a1adb 100644 --- a/resources/views/cart.blade.php +++ b/resources/views/cart.blade.php @@ -12,9 +12,17 @@
@foreach($user->cart as $product) + {{-- dd($product->pivot->quantity) --}}
-
+ + + + @csrf + +
+
+ @csrf
@@ -26,6 +34,7 @@ @csrf @foreach($user->cart as $product) + @endforeach() diff --git a/resources/views/order/create.blade.php b/resources/views/order/create.blade.php index a07d6ea..5c7fdab 100644 --- a/resources/views/order/create.blade.php +++ b/resources/views/order/create.blade.php @@ -15,9 +15,10 @@ @endif
- @foreach($products as $product) - - + @foreach($products_with_quantities as $product) + + + @endforeach diff --git a/resources/views/user.blade.php b/resources/views/user.blade.php index b3bf487..8e91688 100644 --- a/resources/views/user.blade.php +++ b/resources/views/user.blade.php @@ -9,8 +9,6 @@ @section('main')

Welcome, you are logged in as {{ $user->name }} -

-

- Logout + Logout

@endsection()