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
相关产品推荐
相关产品推荐

