You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 18:30:03