id(); $table->foreignId('user_id')->constrained()->cascadeOnDelete(); $table->foreignId('category_id')->nullable()->constrained()->nullOnDelete(); $table->string('title'); $table->string('slug')->unique(); $table->text('excerpt')->nullable(); $table->longText('content'); $table->string('cover_image')->nullable(); $table->json('gallery')->nullable(); // ins风格的图片墙 $table->enum('status', ['draft', 'published', 'scheduled'])->default('draft'); $table->timestamp('published_at')->nullable(); $table->boolean('is_featured')->default(false); $table->unsignedInteger('views_count')->default(0); $table->unsignedInteger('likes_count')->default(0); $table->timestamps(); $table->index(['status', 'published_at']); $table->index('is_featured'); }); // 文章标签多对多关联表 Schema::create('post_tag', function (Blueprint $table) { $table->id(); $table->foreignId('post_id')->constrained()->cascadeOnDelete(); $table->foreignId('tag_id')->constrained()->cascadeOnDelete(); $table->timestamps(); $table->unique(['post_id', 'tag_id']); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('post_tag'); Schema::dropIfExists('posts'); } };