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

时间:2018-12-05 15:47:43

标签: php mysql laravel

我试图使用一种简单的形式在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:插入poststitlepost,{{1 }},authorupdated_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:rollbackmigrate等,但是没有任何效果。

您知道为什么在插入查询中不包含migrate:refresh列吗?

3 个答案:

答案 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()函数自动创建的查询中。

也许这对将来有帮助!