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

Laravel中为image_sliders表创建模型:$fillable与表名主键设置的区别

问题背景

我通过以下代码创建了名为image_sliders的数据表:

public function up(): void
{
    Schema::create('image_sliders', function (Blueprint $table) {
        $table->id('image_sliders_id');            
        $table->text('body')->nullable();
        $table->string('image');
        $table->boolean('status')->default(1);
        $table->timestamps();
    });
}

现在要为该表创建对应的Model类,发现两种写法:
第一种是用protected $fillable定义可填充字段:

class image_slider extends Model
{
    use HasFactory;
    protected $fillable = [
        'body',
        'image'
    ];
}

第二种是指定表名和主键名称:

class image_slider extends Model
{
    use HasFactory;
    protected $table = 'image_sliders';
    protected $primaryKey = 'image_sliders_id';
}

想请教这两种写法之间的区别是什么?


两种写法的核心区别

这两种写法是针对Laravel Model不同配置维度的设置,彼此不冲突,甚至可以同时使用:

  • protected $fillable:管控批量赋值的允许字段
    Laravel默认会防范批量赋值漏洞,只有在$fillable数组里声明的字段,才能通过create()、update()或者fill()这类批量赋值方法修改。比如你用image_slider::create(['body' => '测试内容', 'image' => 'test.jpg'])时,只有body和image会被写入数据库,其他字段(比如status)没法通过这种方式批量设置。要是没声明$fillable,批量赋值操作直接会抛出异常。

  • protected $table和protected $primaryKey:明确模型与数据表的映射关系

    • $table:Laravel默认会根据Model类名的复数形式推断表名,比如ImageSlider类会对应image_sliders表,但你的Model类名是小写的image_slider,虽然刚好能匹配,但显式声明$table = 'image_sliders'能避免类名变更导致的表名匹配错误,逻辑更清晰。
    • $primaryKey:Laravel默认主键是id,但你的表主键是image_sliders_id,所以必须显式设置$primaryKey = 'image_sliders_id',不然Model会默认去查找id字段,导致查询、更新等操作出错。

总结

如果你的Model需要支持批量赋值,就必须设置$fillable;如果你的表名不符合Laravel默认的类名复数规则,或者主键不是默认的id,就需要设置$table和$primaryKey。实际开发中通常会把这两类配置结合起来用,比如:

class image_slider extends Model
{
    use HasFactory;
    protected $table = 'image_sliders';
    protected $primaryKey = 'image_sliders_id';
    protected $fillable = [
        'body',
        'image',
        'status'
    ];
}

内容的提问来源于stack exchange,提问作者user4221591

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 07:17:36