【问题标题】:SQLSTATE[23000]: Integrity constraint violation: 19 NOT NULL constraint failed:SQLSTATE [23000]:违反完整性约束:19 NOT NULL 约束失败:
【发布时间】:2018-03-20 04:42:11
【问题描述】:

试图在 laravel 上创建一个待办事项列表应用程序,但是当我尝试单击按钮创建一个新的待办事项列表时,我收到此错误:

SQLSTATE[23000]: Integrity constraint violation: 19 NOT NULL constraint failed: tasks.description (SQL: insert into "tasks" ("description", "user_id", "updated_at", "created_at") values (, 1, 2017-10-09 03:28:35, 2017-10-09 03:28:35))

这是我的控制器:

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */

    public function tasks()
    {
        return $this->hasMany(Task::class);
    }

    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];
}

这是我的任务模型:

命名空间应用程序;

使用 Illuminate\Database\Eloquent\Model;

class Task extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }

}

这里是用户模型:

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */

    public function tasks()
    {
        return $this->hasMany(Task::class);
    }

    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];
}

这里是视图:

@extends('layouts.app')

@section('content')
    <div class="container">
        @if (Auth::check())
            <h2>Tasks List</h2>
            <a href="/task" class="btn btn-primary">Add new Task</a>
            <table class="table">
                <thead><tr>
                    <th colspan="2">Tasks</th>
                </tr>
                </thead>
                <tbody>@foreach($user->tasks as $task)
                    <tr>
                        <td>
                            {{$task->description}}
                        </td>
                        <td>

                            <form action="/task/{{$task->id}}">
                                <button type="submit" name="edit" class="btn btn-primary">Edit</button>
                                <button type="submit" name="delete" formmethod="POST" class="btn btn-danger">Delete</button>
                                {{ csrf_field() }}
                            </form>
                        </td>
                    </tr>


                @endforeach</tbody>
            </table>
        @else
            <h3>You need to log in. <a href="/login">Click here to login</a></h3>
        @endif

    </div>
@endsection

似乎无法找出问题所在,谷歌似乎也不知道。

【问题讨论】:

  • 你有一个模型作为控制器?
  • 不....是什么让你这么认为?
  • 也许您没有为某个字段输入数据。检查您的迁移以确保。

标签: php laravel laravel-5.5


【解决方案1】:

因为tasks表中的描述值是空的。

这是解决问题的方法-

  1. 如果描述可以为空,则从数据库表结构中使其可以为空。

  2. 在模型上添加$fillable属性-

    class Task extends Model
    {
        //add this
        protected $fillable = ["description", "user_id"];
    
        public function user()
        {
            return $this->belongsTo(User::class);
        }
    }
    

【讨论】:

  • 这不起作用...可能是因为我使用的是 sqlite 而不是 mySql
【解决方案2】:

你得到的错误意味着表中有一些列没有空约束,你正在插入/更新空值。

纠正它:

1) 为该列提供一个非空值并将其添加到您的任务模型 sn-p 如下:

protected $fillable = [
    'description'];

2) 通过编写使迁移文件的表中的列可以为空:

$table->('description')->nullable();

从它的任务模型中删除你(在你的表中)可以为空的列名。

=> 通过删除所有表来清空phpmyadmin 中的数据库。

=> 运行命令:php artisan migrate

=> 再次尝试执行您的操作。

【讨论】:

  • 这不起作用...可能是因为我使用的是 sqlite 而不是 mySql
【解决方案3】:

在您的任务模型中,尝试添加:

protected $fillable = ["description", "user_id"];

【讨论】:

    【解决方案4】:

    您需要刷新数据库表。您在模型或迁移中不存在的数据库中有一个 column。并且您没有为该字段输入数据。我刚刚删除了所有表并运行了迁移。 php artisan migrate:fresh.

    【讨论】:

      【解决方案5】:

      在我的情况下,我输入了之前插入的相同唯一 ID,并且在删除该特定记录后,它起作用了。此外,如果您有一个打开的 SQLite 数据库浏览器,请尝试完全关闭它{“PDOException:SQLSTATE [HY000]:一般错误:5 数据库已锁定”,然后此错误再次出现}。它对我有用。我知道这是一个菜鸟解决方案,但认为分享这可能会有所帮助。

      【讨论】:

        猜你喜欢
        • 2021-06-10
        • 2021-03-24
        • 1970-01-01
        • 2020-01-28
        • 2020-12-28
        • 2021-01-26
        • 2020-09-17
        • 2014-08-18
        相关资源
        最近更新 更多