id(); $table->foreignId('category_id')->nullable()->constrained()->nullOnDelete(); $table->foreignId('source_id')->nullable()->constrained()->nullOnDelete(); $table->string('title', 200); $table->string('slug')->unique(); $table->string('excerpt', 320); $table->longText('body'); $table->string('source_name', 160)->nullable(); $table->string('source_url', 2048)->nullable(); $table->string('source_level', 32)->default('unknown'); $table->timestamp('last_verified_at')->nullable(); $table->string('status', 32)->default('draft'); $table->boolean('is_stale')->default(false); $table->text('stale_note')->nullable(); $table->string('seo_title', 180)->nullable(); $table->string('seo_description', 320)->nullable(); $table->string('h1', 180)->nullable(); $table->string('canonical_url', 2048)->nullable(); $table->timestamp('published_at')->nullable(); $table->timestamps(); $table->index(['status', 'published_at']); $table->index(['is_stale', 'last_verified_at']); $table->fullText(['title', 'excerpt', 'body']); }); } public function down(): void { Schema::dropIfExists('articles'); } };