【问题标题】:Laravel - insert query generated by create() method missing a columnLaravel - 由 create() 方法生成的插入查询缺少一列
【发布时间】:2019-05-07 05:44:00
【问题描述】:

我正在尝试使用简单的表格在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, author, updated_at, @ 987654333@) values (test, some text, 2, 2018-12-05 15:00:33, 2018-12-05 15:00:33)) ◀"

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

在我的数据库中,表 posts 包含 slug 列。当我运行 \Schema::getColumnListing('posts'); 时,它也会在 tinker 上显示。

可能有帮助:我稍后将 slug 列添加到迁移类中,在此之前一切正常。在将列添加到迁移类后,我确实运行了migrate:fresh 命令;当然,到目前为止,我已经尝试了所有 migrate:rollback,然后是 migratemigrate:refresh 等等……但没有任何效果。

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

【问题讨论】:

  • 可以先清除缓存吗?
  • 我确实清理了缓存,没有运气:(
  • 您好 Echoes,您的错误 SQL 语句与控制器中的硬编码值不匹配。那是因为您复制粘贴了一个旧示例吗?还是有什么东西卡在某个地方的队列中?我有时会在调试时将其注入我的 AppServiceProvider 以详细查看所有查询:DB::listen(function ($query) { Log::debug("[sql] [query] " . $query-&gt;sql); Log::debug("[sql] [bindings] " . print_r($query-&gt;bindings, true)); });
  • 啊,是的,我复制粘贴了旧示例,我的错,我将对其进行编辑。
  • 您是否尝试过使用另一种创建方法来查看是否可行,以及批量分配是否存在问题或 SQL 是否在某处出现问题?例如。 $post = new Post; $post-&gt;title = "title"; $post-&gt;slug = "test-slug"; $post-&gt;save();

标签: php mysql laravel


【解决方案1】:

回滚您的迁移,再次迁移。

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

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

【讨论】:

  • 正如我在帖子中所写,我已经尝试过migrate:rollback,然后再次迁移,它不起作用:(我认为批量分配方法存在一些问题,因为如果我使用普通的$post-&gt;save() 方法插入行。
  • 你有没有像我写的那样改变模型?
【解决方案2】:

如果您已经在模型的可填充属性中添加了“slug”,则表单中的数据不包含“slug”属性。您可以使用以下方法将请求转储到控制器中:

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

【讨论】:

  • 是的,表单数据不包含属性“slug”,我正在控制器中创建 slug。但这并不重要,因为如我的帖子所示,我只是使用硬编码的值,所以我认为 slug 是否在我的请求中并不重要。
  • 尝试使用 forceCreate 而不是 create。如果问题仍然存在,则可能是数据库有问题。
【解决方案3】:

这个问题已经存在几个月了,但我刚刚遇到了同样的问题,并在一个非常不同的地方找到了解决方案(就我而言): 一个陷阱是,如果你设置一个

public function setSlugAttribute($value) {}

在您的 Post 模型中。 (请注意,该函数是用 CamelCase 编写的,即使该属性是用 snake_case 编写的。) 如果你没有在这个函数中设置任何东西到

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

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

也许这对未来的人有帮助!

【讨论】:

    猜你喜欢
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 2017-10-15
    • 2015-08-06
    相关资源
    最近更新 更多