违反完整性约束:19 NOT NULL约束因迁移表中未包含的内容而失败

时间:2019-08-14 08:03:28

标签: php laravel sqlite laravel-5.8

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

  

SQLSTATE [23000]:违反完整性约束:19 NOT NULL约束>失败:posts.title(SQL:插入“ posts”(“标题”,“ image”,“ user_id”,>“ updated_at”,“ created_at” ”)(值(kjhgj,C:\ xampp \ tmp \ phpE3B7.tmp,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解释了为什么这些命令在本文的注释中起作用。

2 个答案:

答案 0 :(得分:0)

要允许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尝试将数组的所有数据插入数据库表。

答案 1 :(得分:0)

这是一个远景,但是我会做些不同的事情,并手动测试所有内容以查看它是否有效。例如,您可以尝试以下方法:

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!';
    }
}

让我知道这是否可行。