完整性约束违规:19 NOT NULL 约束因迁移表中没有的内容而失败

Posted

技术标签:

【中文标题】完整性约束违规:19 NOT NULL 约束因迁移表中没有的内容而失败【英文标题】:Integrity constraint violation: 19 NOT NULL constraint failed for something not in migration table 【发布时间】:2019-12-20 18:26:31 【问题描述】:

使用 Laravel 5.8.31,我似乎对表中不应为空的某些内容违反了完整性约束。问题是它告诉我迁移文件中的posts.title 不应该为空,但该变量甚至不在迁移表中。

SQLSTATE[23000]:完整性约束违规:19 NOT NULL 约束>失败:posts.title(SQL:插入“posts”(“caption”、“image”、“user_id”、>“updated_at”、“created_at ") 值 (kjhgj, C:\xampp\tmp\phpE3B7.tmp, 1, 2019->08-14 07:14:03, 2019-08-14 07:14:03))

我正在尝试学习 Laravel,并且一直在关注这个 youtube 教程 https://www.youtube.com/watch?v=ImtZ5yENzgE

从我从浏览器获得的错误页面中,我可以看到 PostsController.php 中引发了错误。

我赶到了 2:04:00,但遇到了这个问题。我已经阅读了许多其他在这里提出和回答的问题,但没有运气。

帖子迁移文件

class CreatePostsTable extends Migration

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    
        Schema::create('posts', function (Blueprint $table) 
            $table->bigIncrements('id');
            $table->unsignedBigInteger('user_id');
            $table->string('caption');
            $table->string('image');
            $table->timestamps();
            $table->index('user_id');
            // THERE IS NO 'title' entry.
        );
    

帖子模型文件

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model

    //Tutorial uses guarded rather than fillable
    protected $guarded = [];

    public function user()
    return $this->belongsTo(User::class);
    

发布控制器文件

class PostsController extends Controller

    public function create()
    
        return view('posts.create');
    

    public function store()
    
        $data = request()->validate([
            'caption' => 'required',
            'image' => ['required','image'],
        ]);

       auth()->user()->posts()->create($data); //ERROR IS THROWN HERE


        dd(request()->all());
    

我有一个页面,用户可以在其中输入标题并上传文件。 没有任何验证,我可以dd(request()->all()); 看到标题和文件已收到。但是当我在控制器文件中添加验证和auth() 行时,我得到“posts.title”的完整性约束违规

我希望将标题和图像添加到数据库中。

第一次发帖,因为我通常可以找到答案,但这次我卡住了。

编辑:这是错误: Error Image

解决了

@Vipertecpro 能够解决我的问题。我必须运行以下两个命令: php artisan migrate:refresh --seed 然后php artisan optimize:clear

@Don'tPanic 解释了为什么这些命令在这篇文章的 cmets 中有效。

【问题讨论】:

试试这个Post::create(['column_name' => $request->get('value')]),而不是auth()->user()->posts()->create($data);,你为什么不在模型内的$fillable变量中包含所有列? 请分享您正在关注的视频链接以实现这个简单的 crud @Vipertecpro 我在帖子中有链接以及视频中的时间。我不使用 fillable 的原因是因为他说只需将一个空字符串传递给 $guarded (似乎不是一个好主意,但我刚刚学习)。 参考这个以获得清晰的理解laravel.com/docs/5.8/eloquent#inserting-and-updating-models 并且请考虑观看任何编程视频以学习任何东西的最后一种方法,否则两种非常有效的方法是官方文档和点击和试用方法,相信我你会发现将数据插入数据库的方法超过 2 种。 :) 编码愉快。 "title" 列是否在您的 post 表中? 【参考方案1】:

这是一个长镜头,但我会做不同的事情并手动测试所有内容以查看它是否有效。例如,你可以试试这个:

class PostsController extends Controller

    public function create()
    
        return view('posts.create');
    

    public function store(Request $request)
    

        //Remove this for now
        //$data = request()->validate([
        //    'caption' => 'required',
        //    'image' => ['required','image'],
        //]);

       $post = new Post;

       $post->user_id = Auth::user()->id;

       $post->caption = $request->caption;
       //This assumes that you have 'caption' as your `name` in html. '<input type="text" name="caption" />'

       $post->image = $request->image;
       //The image should be processed but this will give an output for now.

       $post->save();

       //The save ignores $fillable or any such and depends on the request and SAVES it to the model or table


        return 'worked!';
    

让我知道这是否有效。

【讨论】:

其他人能够解决这个问题。不过,我很感谢您的回复。【参考方案2】:

要允许 Laravel 在数据库中进行大规模插入或更新,您必须在模型中声明 $fillable 变量。

在你的情况下:

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model

    //Tutorial uses guarded rather than fillable
    //protected $guarded = []; // If you use $fillable do not use $guarded

    // HERE
    protected $fillable = ['user_id', 'caption', 'image'];  

    public function user()
        return $this->belongsTo(User::class);
    

如果不这样做,Laravel 会尝试将数组的所有数据插入 DB 表中。

【讨论】:

我明白这一点,但视频将一个空字符串传递给 guarded。即使我将您的行添加到我的代码中并注释掉 Post Model 中的受保护行,我仍然会收到 posts.title 的错误,这对我来说没有意义。 guarded 与可填充相反。你用它告诉 laravel 在进行大量插入或更新之前不要填​​写哪些字段。我编辑了我的答案 哦,我明白了。这就是为什么视频说要传递一个空数组给它的原因。它使他不必每次都制作一个可填充的。无论如何,谢谢你的回复。 @Vipertecpro 解决了我的问题。我必须运行两个命令。

以上是关于完整性约束违规:19 NOT NULL 约束因迁移表中没有的内容而失败的主要内容,如果未能解决你的问题,请参考以下文章

JSLint 严格违规。面向对象的 Javascript 挫折

未捕获的错误:不变违规:元素类型无效:对象

Spring - 在所有自定义身份验证提供程序结束时记录安全违规

不变违规:组件`div`的视图配置getter回调必须是一个函数(收到`undefined`)

不变违规:一个 VirtualizedList 包含一个单元格,该单元格本身包含多个 VirtualizedList

控制台未在 Apple 的快速启动中显示 Mac OS 应用沙箱违规