From ad1c06ee1819b3512e2443d5cbe06199a0ae9bad Mon Sep 17 00:00:00 2001 From: Sam Light Date: Tue, 10 Feb 2026 00:21:10 +0000 Subject: Created order tables and models --- workbench/app/Enums/OrderStatus.php | 11 +++++ workbench/app/Models/Order.php | 51 ++++++++++++++++++++++ workbench/database/factories/OrderFactory.php | 35 +++++++++++++++ .../2025_04_01_000000_create_orders_table.php | 40 +++++++++++++++++ workbench/database/seeders/DatabaseSeeder.php | 15 ++++++- 5 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 workbench/app/Enums/OrderStatus.php create mode 100644 workbench/app/Models/Order.php create mode 100644 workbench/database/factories/OrderFactory.php create mode 100644 workbench/database/migrations/2025_04_01_000000_create_orders_table.php diff --git a/workbench/app/Enums/OrderStatus.php b/workbench/app/Enums/OrderStatus.php new file mode 100644 index 0000000..555e31a --- /dev/null +++ b/workbench/app/Enums/OrderStatus.php @@ -0,0 +1,11 @@ + + */ + use HasFactory; + + /** + * @return OrderFactory + */ + protected static function newFactory(): OrderFactory + { + return OrderFactory::new(); + } + + /** + * @return array + */ + protected function casts(): array + { + return [ + 'status' => OrderStatus::class, + ]; + } + + /** + * @return BelongsToMany + */ + public function products(): BelongsToMany + { + return $this->belongsToMany(Product::class)->withPivot('quantity', 'price')->withTimestamps(); + } +} diff --git a/workbench/database/factories/OrderFactory.php b/workbench/database/factories/OrderFactory.php new file mode 100644 index 0000000..4a48a63 --- /dev/null +++ b/workbench/database/factories/OrderFactory.php @@ -0,0 +1,35 @@ + + */ +class OrderFactory extends Factory +{ + /** + * The name of the factory's corresponding model. + * + * @var class-string + */ + protected $model = Order::class; + + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'status' => fake()->randomElement(OrderStatus::cases()), + 'total' => 0, + ]; + } +} diff --git a/workbench/database/migrations/2025_04_01_000000_create_orders_table.php b/workbench/database/migrations/2025_04_01_000000_create_orders_table.php new file mode 100644 index 0000000..838349c --- /dev/null +++ b/workbench/database/migrations/2025_04_01_000000_create_orders_table.php @@ -0,0 +1,40 @@ +id(); + $table->enum('status', OrderStatus::cases()); + $table->decimal('total', total: 10, places: 2); + $table->timestamps(); + }); + + Schema::create('order_product', function (Blueprint $table) { + $table->id(); + $table->foreignId('order_id')->constrained()->cascadeOnDelete(); + $table->foreignId('product_id')->constrained()->cascadeOnDelete(); + $table->unsignedInteger('quantity'); + $table->decimal('price', total: 8, places: 2); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('order_product'); + Schema::dropIfExists('orders'); + } +}; diff --git a/workbench/database/seeders/DatabaseSeeder.php b/workbench/database/seeders/DatabaseSeeder.php index 9b7e84a..5dddc62 100644 --- a/workbench/database/seeders/DatabaseSeeder.php +++ b/workbench/database/seeders/DatabaseSeeder.php @@ -4,6 +4,7 @@ namespace Workbench\Database\Seeders; use Illuminate\Database\Seeder; use Workbench\App\Models\Category; +use Workbench\App\Models\Order; use Workbench\App\Models\Product; class DatabaseSeeder extends Seeder @@ -15,9 +16,21 @@ class DatabaseSeeder extends Seeder { $categories = Category::factory()->count(10)->create(); - Product::factory() + $products = Product::factory() ->state(fn () => ['category_id' => $categories->random()->id]) ->count(104) ->create(); + + Order::factory()->count(50)->create()->each(function ($order) use ($products) { + $orderProducts = $products->random(rand(1, 5)); + foreach ($orderProducts as $product) { + $quantity = rand(1, 5); + $order->products()->attach($product->id, [ + 'quantity' => $quantity, + 'price' => $product->price, + ]); + } + $order->update(['total' => $order->products->sum(fn ($p) => $p->pivot->quantity * $p->pivot->price)]); + }); } } -- cgit v1.2.3