From 31b79d70c53a72bcbb190fcff7afbaf415f9e783 Mon Sep 17 00:00:00 2001 From: dimon8 Date: Wed, 7 Jan 2026 06:44:07 +0000 Subject: [PATCH] 123 --- app/Models/Component.php | 33 ++++++++++++++++-- app/Models/ComponentType.php | 15 ++++++++ app/Models/PCBuild.php | 31 +++++++++++++++++ ...5_10_29_154421_create_components_table.php | 12 ++++--- ...06_103303_create_component_types_table.php | 34 +++++++++++++++++++ ...26_01_06_122343_create_pc_builds_table.php | 26 ++++++++++++++ 6 files changed, 144 insertions(+), 7 deletions(-) create mode 100644 app/Models/ComponentType.php create mode 100644 app/Models/PCBuild.php create mode 100644 database/migrations/2026_01_06_103303_create_component_types_table.php create mode 100644 database/migrations/2026_01_06_122343_create_pc_builds_table.php diff --git a/app/Models/Component.php b/app/Models/Component.php index b5662f5..c08b33a 100644 --- a/app/Models/Component.php +++ b/app/Models/Component.php @@ -2,9 +2,38 @@ namespace App\Models; +use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Component extends Model { - -} + use HasFactory; + + protected $fillable = [ + 'name', + 'component_type_id', + 'price', + 'specifications', + 'is_official', + 'created_by_user_id', + ]; + + protected $casts = [ + 'specifications' => 'array', // Автоматически преобразует JSON в массив + 'is_official' => 'boolean', + 'created_at' => 'datetime', + 'updated_at' => 'datetime', + ]; + + // Связь с типом компонента + public function type() + { + return $this->belongsTo(ComponentType::class, 'component_type_id'); + } + + // Связь с пользователем (если добавил пользователь) + public function createdBy() + { + return $this->belongsTo(User::class, 'created_by_user_id'); + } +} \ No newline at end of file diff --git a/app/Models/ComponentType.php b/app/Models/ComponentType.php new file mode 100644 index 0000000..4609ce5 --- /dev/null +++ b/app/Models/ComponentType.php @@ -0,0 +1,15 @@ + 'datetime', + 'updated_at' => 'datetime', + ]; +} diff --git a/app/Models/PCBuild.php b/app/Models/PCBuild.php new file mode 100644 index 0000000..abfce54 --- /dev/null +++ b/app/Models/PCBuild.php @@ -0,0 +1,31 @@ + 'boolean', + 'created_at' => 'datetime', + 'updated_at' => 'datetime', + ]; + + // Связь с пользователем + public function user() + { + return $this->belongsTo(User::class); + } +} \ No newline at end of file diff --git a/database/migrations/2025_10_29_154421_create_components_table.php b/database/migrations/2025_10_29_154421_create_components_table.php index 3663af9..8dc9a76 100644 --- a/database/migrations/2025_10_29_154421_create_components_table.php +++ b/database/migrations/2025_10_29_154421_create_components_table.php @@ -13,14 +13,16 @@ return new class extends Migration { Schema::create('components', function (Blueprint $table) { $table->id(); + $table->string('name'); // Например: "Intel Core i5-12400F" + $table->foreignId('component_type_id')->constrained()->onDelete('cascade'); + $table->decimal('price', 10, 2); + $table->json('specifications')->nullable(); // Для хранения характеристик + $table->boolean('is_official')->default(true); // true = админ, false = пользователь + $table->foreignId('created_by_user_id')->nullable()->constrained('users')->onDelete('set null'); $table->timestamps(); - $table->text('name'); - $table->text('type'); - $table->text('brand'); - $table->text('model'); - $table->integer('price'); }); } + /** * Reverse the migrations. diff --git a/database/migrations/2026_01_06_103303_create_component_types_table.php b/database/migrations/2026_01_06_103303_create_component_types_table.php new file mode 100644 index 0000000..2fa3291 --- /dev/null +++ b/database/migrations/2026_01_06_103303_create_component_types_table.php @@ -0,0 +1,34 @@ +id(); + $table->string('name'); // Например: "Процессор", "Видеокарта" + $table->string('code')->unique(); // Уникальный код: cpu, gpu, ram и т.д. + $table->timestamps(); + }); + + // Заполняем таблицу начальными данными (seed) + DB::table('component_types')->insert([ + ['name' => 'Процессор', 'code' => 'cpu'], + ['name' => 'Видеокарта', 'code' => 'gpu'], + ['name' => 'Материнская плата', 'code' => 'motherboard'], + ['name' => 'ОЗУ', 'code' => 'ram'], + ['name' => 'Блок питания', 'code' => 'psu'], + ['name' => 'SSD', 'code' => 'ssd'], + ['name' => 'Корпус', 'code' => 'case'], + ]); + } + + public function down() + { + Schema::dropIfExists('component_types'); + } +}; diff --git a/database/migrations/2026_01_06_122343_create_pc_builds_table.php b/database/migrations/2026_01_06_122343_create_pc_builds_table.php new file mode 100644 index 0000000..11fe7dd --- /dev/null +++ b/database/migrations/2026_01_06_122343_create_pc_builds_table.php @@ -0,0 +1,26 @@ +id(); + $table->foreignId('user_id')->constrained()->onDelete('cascade'); + $table->string('name'); // Например: "Игровой ПК 2025" + $table->text('description')->nullable(); // Описание + $table->boolean('is_ai_generated')->default(false); // true = сгенерировано ИИ + $table->text('ai_prompt')->nullable(); // Исходный запрос к ИИ + $table->timestamps(); + }); + } + + public function down() + { + Schema::dropIfExists('pc_builds'); + } +} \ No newline at end of file