id(); $table->string('slug')->unique(); $table->jsonb('name'); $table->jsonb('description')->nullable(); $table->string('type'); $table->boolean('is_visible')->default(false); $table->boolean('is_required')->default(false); $table->boolean('is_searchable')->default(false); $table->boolean('is_filterable')->default(false); $table->integer('sort_order')->nullable(); $table->timestamps(); }); Schema::create('attribute_values', function (Blueprint $table) { $table->id(); $table->jsonb('value'); $table->string('key')->unique(); $table->foreignId('attribute_id')->constrained()->cascadeOnDelete(); $table->integer('sort_order')->nullable(); $table->timestamps(); }); Schema::create('product_attributes', function (Blueprint $table) { $table->id(); $table->foreignId('product_id')->constrained()->cascadeOnDelete(); $table->foreignId('attribute_id')->constrained()->cascadeOnDelete(); }); Schema::create('attribute_value_product_attribute', function (Blueprint $table) { $table->id(); $table->foreignId('attribute_value_id')->nullable()->constrained()->cascadeOnDelete(); $table->foreignId('product_attribute_id')->constrained()->cascadeOnDelete(); $table->string('product_custom_value')->nullable(); }); Schema::create('attribute_category', function (Blueprint $table) { $table->id(); $table->foreignId('attribute_id')->constrained('attributes')->cascadeOnDelete(); $table->foreignId('category_id')->constrained('categories')->cascadeOnDelete(); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('attributes'); Schema::dropIfExists('attribute_values'); Schema::dropIfExists('product_attributes'); Schema::dropIfExists('attribute_value_product_attribute'); Schema::dropIfExists('attribute_category'); } };