Laravel数据库插入时能否留空字段?点赞点踩字段需设默认值吗?
嘿,我来帮你把这两个问题讲清楚:
问题一:Laravel插入数据时是否允许保留字段为空?
这个问题的核心取决于你数据库表字段的定义(也就是你迁移文件里的设置):
- 如果在迁移中给字段添加了
->nullable()约束,那这个字段就允许为空值,插入数据时完全可以不赋值,数据库会自动存NULL。比如:$table->string('description')->nullable(); - 如果没加
->nullable(),那这个字段默认是非空约束,这时候如果插入时不赋值,要么Laravel会抛出验证错误(如果你做了表单验证),要么数据库直接报错,拒绝这条数据插入。
问题二:images表的upvotes和downvotes是否需要手动设0?
这同样看你迁移里的字段配置,分两种情况:
情况1:迁移中已经设置了默认值0
如果你的迁移文件里给这两个字段加了->default(0),那完全可以省略$image->upvotes = 0;和$image->downvotes = 0;这两行代码!插入数据时,数据库会自动把这两个字段的值设为0。比如正确的迁移写法:
$table->integer('upvotes')->default(0); $table->integer('downvotes')->default(0);
情况2:迁移中没设置默认值
如果没加默认值,那要看字段是否允许为空:
- 如果字段允许为空(加了
->nullable()),不赋值的话会存NULL,但点赞/点踩数用NULL其实不太合理——比如后续做统计(比如计算总点赞数)时,NULL会被数据库忽略,而0才是符合业务逻辑的初始值。 - 如果字段不允许为空,那必须手动赋值0,否则插入会失败。
补充建议
如果你的迁移里还没设置默认值,我强烈建议你给这两个字段加上->default(0)。如果已经建表了,可以创建一个新的迁移文件来修改字段:
php artisan make:migration add_default_values_to_images_table
然后在新迁移文件里写:
public function up() { Schema::table('images', function (Blueprint $table) { $table->integer('upvotes')->default(0)->change(); $table->integer('downvotes')->default(0)->change(); }); } public function down() { Schema::table('images', function (Blueprint $table) { $table->integer('upvotes')->default(null)->change(); $table->integer('downvotes')->default(null)->change(); }); }
执行php artisan migrate就能完成修改,之后插入数据就不用手动设0啦~
内容的提问来源于stack exchange,提问作者Onyx
相关产品推荐
相关产品推荐

