我试图使用一个简单的表单在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
(title
、post
、author
、updated_at
、created_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
,然后是migrate
,migrate: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()
函数自动创建的查询中。
也许这对将来的某个人有帮助!