create()方法生成的Laravel-insert查询缺少一列



我试图使用一个简单的表单在posts表中简单地插入一行,这是我的store()插入新行的方法:

//FILE: PostsController.php
public function store(Request $request)
{
//Using hard-coded values instead of actual form data, just to test
Post::create([
'title' => "test",
'post' => "some text",
'author' => "2",
'slug' => "slug-value"
]);
return redirect('/posts');
}

这是我的模型类的帖子:

<?php
namespace App;
use IlluminateDatabaseEloquentModel;
class Post extends Model
{
protected $fillable = [
'title', 'post', 'author', 'slug'
];
}

下面是我的迁移类(只显示public function up(),其余的和任何正常的迁移类一样(:

public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->longtext('post');
$table->integer('author');
$table->string('slug');
$table->string('tags')->nullable();
$table->string('pics')->nullable();
$table->timestamps();
});
}

问题:在提交表单时(即在控制器中调用store()方法时(,会出现以下错误:

"SQLSTATE[HY000]:一般错误:1364字段'slug'没有默认值(SQL:插入posts(titlepostauthorupdated_atcreated_at(值(测试,一些文本,2018-12-05 15:00:332018-12-05 15:00.33((◀">

我不明白为什么laravel生成的插入查询中没有slug列。我花了几个小时搜索这个问题,但即使SO也没有任何相关的答案,其中大多数都显示添加到$fillable中作为解决方案,但我已经有了。

在我的数据库中,表posts确实包含slug列。当我运行Schema::getColumnListing('posts');时,它也在修补程序上显示了它。

PERHAPS HELPFUL:我稍后将slug列添加到迁移类中,在此之前,一切都很顺利。在将列添加到迁移类之后,我确实运行了migrate:fresh命令;当然,到目前为止,我已经尝试了所有的migrate:rollback,然后是migratemigrate:refresh等等,但都不起作用。

知道为什么在插入查询中不包括slug列吗?

回滚迁移,再次迁移。

然后将其更改为您的模型:

protected $fillable = [
'title', 'post', 'author', 'slug', 'tags', 'pics'
];

如果您已经在模型的可填充属性中添加了"slug",那么表单中的数据不包含属性"slug’"。您可以使用在控制器中转储请求

public function smtg(Request $request){
dd($request);
}

这个问题已经存在几个月了,但我刚刚面临同样的问题,并在一个完全不同的地方找到了解决方案:一个陷阱是,如果你设置

public function setSlugAttribute($value) {}

在您的Post模型中。(请注意,函数是用CamelCase编写的,尽管属性是用snake_case编写的。(如果您没有将此功能中的任何内容设置为

$this->attributes['slug'] = ***;

实际上,您的实例中没有设置任何内容,并且该字段不会添加到Post::create()函数自动创建的查询中。

也许这对将来的某个人有帮助!

最新更新