Laravel自动设置slug属性报错:字段'slug'无默认值,求排查
问题原因
你写的setSlugAttribute是slug字段的赋值器(Mutator),这个方法只有在主动给$model->slug赋值时才会触发。但你创建/更新数据时根本没给slug传值,导致这个方法完全没执行,再加上数据库里slug字段没设置默认值,就抛出了1364错误。
解决方案
要实现创建和更新时自动生成slug,推荐用模型事件来处理,它能在数据创建/更新的钩子阶段自动执行逻辑,无需手动给slug传值:
use Illuminate\Support\Str; class YourModel extends Model { protected static function booted() { // 创建时自动生成slug static::creating(function ($model) { $model->slug = $model->generateSlug(); }); // 更新时自动重新生成slug(仅当名字有变化时) static::updating(function ($model) { if ($model->isDirty('first_name') || $model->isDirty('last_name')) { $model->slug = $model->generateSlug(); } }); } // 抽出生成slug的逻辑,方便复用且避免重复 private function generateSlug() { $baseSlug = Str::slug($this->first_name . ' ' . $this->last_name); $slug = $baseSlug; $count = 1; // 若slug已存在,自动添加后缀保证唯一性 while (static::where('slug', $slug)->where('id', '!=', $this->id)->exists()) { $slug = $baseSlug . '-' . $count++; } return $slug; } }
额外注意事项
- 若不想用模型事件,也可以在控制器的
store/update方法里手动生成slug并赋值,但模型事件的写法更符合Laravel的逻辑集中原则。 - 检查数据库表结构:如果
slug字段设置为NOT NULL,要么用上述逻辑确保自动生成,要么给字段设置空字符串作为默认值,前者更合理。
内容的提问来源于stack exchange,提问作者user20597340
相关产品推荐
相关产品推荐

