SQLSTATE [23000]:违反完整性约束:1048列“ post_id”不能为空

时间:2019-07-15 20:38:56

标签: php database laravel

我需要一些帮助...正在为带有教程的标签创建函数,但是在我的数据库(post_tag)中,我的post_id没有保存,只有{{ 1}}和tag_id。在我的id表中,创建帖子后,我收到了posts个帖子,但是在这里,我的id不是。您知道为什么男人...吗?

我的控制器

post_tag

我的create_post_tag_table

public function create(){

        $tags = Tag::all();

        return view('posts.create')->withTags($tags);
    }
public function store(Request $request )
    {



        $data = request()->validate([

            'caption' => 'required|max:255',
            'image' => 'required|image',
        ]);
        $post = new Post;

        $post->tags()->sync($request->tags, false);



        $imagePath = request('image')->store('uploads', 'public');

        $image = Image::make(public_path("storage/{$imagePath}"))->fit(1600, 1100);
        $image->save();

        auth()->user()->posts()->create([
            'caption' => $data['caption'],
            'image' => $imagePath,
        ]);



         return redirect('/profile/' . auth()->user()->id);
    }

我的create_posts_table

  public function up()
    {
        Schema::create('post_tag', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->integer('post_id')->unsigned();
            $table->foreign('post_id')->references('id')->on('posts');

            $table->integer('tag_id')->unsigned();
            $table->foreign('tag_id')->references('id')->on('tags');

        });
    }

3 个答案:

答案 0 :(得分:0)

我可能是错的,但是由于您的表中没有与外键关联的onUpdate或onDelete属性,因此可能是问题所在。

答案 1 :(得分:0)

您已经创建了一个新的 Post 对象,但是尚未在此行中保存它:

$post = new Post;

因此,在此行中紧随其后:

$post->tags()->sync($request->tags, false);

该信息的数据库中目前尚没有id (在 Post 模型中也没有id),因此每次同步都会失败,因为它找不到id

新建 Post 对象后,save(),然后即可进行同步。


在另一个可能会以其他方式有所帮助的注释上,您的帖子模型与id有很大的区别:

Schema::create('posts', function (Blueprint $table) {    
    $table->bigIncrements('id');
}

但是您的post_tag表只是一个整数。这种不匹配可能会导致一些问题。建议更改以匹配:

Schema::create('post_tag', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->integer('post_id')->unsigned(); // <--- suggest change this to bigInteger
        $table->foreign('post_id')->references('id')->on('posts');

答案 2 :(得分:0)

正确的解决方法是:

$post = auth()->user()->posts()->create([
        'caption' => $data['caption'],
        'image' => $imagePath,
    ]);

我刚刚将其添加到我的代码中,一切正常。