Filament中slug无默认值问题求助,执行迁移后仍报错
解决Filament中slug无默认值的问题
首先修复你的迁移代码中的语法错误,这些错误会导致数据库结构异常,进而引发后续问题:
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; return new class extends Migration { public function up(): void { Schema::create('posts', function (Blueprint $table) { $table->id(); $table->foreignId('category_id')->constrained()->onDelete('cascade'); $table->string('title'); $table->string('slug')->unique(); $table->text('content'); $table->boolean('is_published')->default(false); $table->timestamps(); }); } public function down(): void { Schema::dropIfExists('posts'); } };
修复的具体问题:
- 补全
category_id字段onDelete('cascade')的闭合括号 - 修正拼写错误的
Stable为$table - 补全
title字段的引号并修正写法
接下来解决slug无默认值的核心问题:
slug字段设置为unique且无默认值,在Filament创建Post记录时若未自动填充,会触发数据库报错。你可以通过以下两种方式处理:
方式1:在Filament Resource中自动生成slug(推荐)
在PostResource的form方法里,给slug字段添加基于title的自动生成规则:
use Filament\Forms\Components\TextInput; use Illuminate\Support\Str; // ... public static function form(Form $form): Form { return $form ->schema([ // 其他字段... TextInput::make('title') ->required() ->live(onBlur: true) ->afterStateUpdated(function (string $operation, $state, Forms\Set $set) { if ($operation === 'create') { $set('slug', Str::slug($state)); } }), TextInput::make('slug') ->required() ->unique(ignoreRecord: true), // 其他字段... ]); }
用户输入title后,slug会自动生成,避免空值提交。
方式2:给slug字段添加默认值(不推荐)
若希望数据库层面提供默认值,可修改迁移代码中的slug字段:
$table->string('slug')->unique()->default('');
此方式仅解决空值报错问题,不符合slug的实际使用场景,不建议采用。
最后重新执行迁移:
php artisan migrate:fresh
内容的提问来源于stack exchange,提问作者Seewpeng Nea
相关产品推荐
相关产品推荐

