我试图使用一种简单的形式在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 Illuminate\Database\Eloquent\Model;
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
,{{1 }},author
,updated_at
)值(test,some text,2,2018-12-05 15:00:33,2018-12-05 15:00:33))◀“ < / p>
我不明白为什么laravel生成的插入查询中没有created_at
列。我已经花了数小时来搜索这个问题,但是SO甚至都没有与此相关的任何答案,其中大多数都显示了将其添加到slug
中作为解决方案,但是我已经知道了。
在我的数据库中,表$fillable
包含posts
列。当我运行slug
时,它也会在修补程序中显示。
帮助大家:我稍后在迁移类中添加了\Schema::getColumnListing('posts');
列,然后一切正常。在将列添加到迁移类之后,我确实运行了slug
命令;当然,到目前为止,我已经尝试了所有migrate:fresh
,然后尝试了migrate:rollback
,migrate
等,但是没有任何效果。
您知道为什么在插入查询中不包含migrate:refresh
列吗?
答案 0 :(得分:0)
回滚您的迁移,再次迁移。
然后将其更改为您的模型:
protected $fillable = [
'title', 'post', 'author', 'slug', 'tags', 'pics'
];
答案 1 :(得分:0)
如果您已经在模型的fillable属性中添加了“ slug”,则表单中的数据不包含属性“ slug”。您可以使用以下命令将请求转储到控制器中:
public function smtg(Request $request){
dd($request);
}
答案 2 :(得分:0)
这个问题现在已有几个月的历史了,但我遇到了同样的问题,并在一个非常不同的地方找到了解决方案(以我为例): 一个陷阱是,如果您设置
public function setSlugAttribute($value) {}
在您的帖子模型中。 (请注意,即使该属性是用snake_case编写的,该函数也是用CamelCase编写的。) 如果您在此功能中未对
进行任何设置$this->attributes['slug'] = ***;
实际上没有为您的实例设置任何内容,并且此字段未添加到由Post::create()
函数自动创建的查询中。
也许这对将来有帮助!