我无法删除数据透视表中存在的记录

我有五个表:


邮政

类别

标签

category_post

post_tag

我遇到的问题是,如果我删除帖子,那么它也应该删除所有相关表中该帖子的所有关系。但是系统正在执行完全相反的操作,它只是删除帖子表中的帖子。


我找到了一个解决方案


$table->engine='InnoDB'

但我的问题还是一样


这是我对 Category_post 数据透视表的迁移


public function up()

{

    Schema::create('post_tag', function (Blueprint $table) {

        $table->engine = 'InnoDB';

        $table->integer('post_id')->index()->unsigned();

        $table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade');

        $table->integer('tag_id')->index()->unsigned();

        $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade');

        $table->timestamps();

    });

}

这就是我在控制器中所做的


public function destroy(Post $post)

{

    $post=Post::find($post->id);

    $post->delete();

    return redirect('admin/post')->with('message','Deleted Sucessfully');

}

我也试过这个


  public function destroy(Post $post)

{

    $post=Post::find($post->id);

    $post->categories()->delete();

    $post->tags()->delete();

    $post->delete();

    return redirect('admin/post')->with('message','Deleted Sucessfully');

}

但得到了相同的结果


繁星淼淼
浏览 297回答 1
1回答

12345678_0001

在 Laravel 中为 ManyToMany 关系使用数据透视表时,您应该将关联的标签和类别与 Post 模型分离,而不是按照文档删除它们此外,您的控制器代码正在删除标签和类别模型,而不是会破坏任何关联的关联附加到这些标签和类别的其他帖子。这是在您的tags迁移中执行此操作的正确方法的示例    /**     * Run the migrations.     *     * @return void     */    public function up()    {        Schema::create('tags', function (Blueprint $table) {            $table->bigIncrements('id');            // Any other columns goes here            $table->timestamps();        });        Schema::create('post_tag', function (Blueprint $table) {            $table->bigInteger('post_id');            $table->bigInteger('tag_id');            // ensures a specific post can be associated a specific tag only once            $table->primary(['post_id', 'tag_id']);        });    }    /**     * Reverse the migrations.     *     * @return void     */    public function down()    {        Schema::dropIfExists('post_tag');        Schema::dropIfExists('tags');    }为类别迁移做同样的事情在你的 Eloquent 模型中指定ManyToMany关系,像这样class Post extends Model{    public function tags()    {        return $this->belongsToMany('App\Tag');    }    public function categories()    {        return $this->belongsToMany('App\Category');    }}现在,当将标签/类别与帖子相关联时,请使用该attach方法$post = Post::create([]); // this is only sample code, fill your data as usual$tag = Tag::create([]);$category = Category::create([]);// You can either attach by the model itself or ID$post->tags()->attach($tag);$post->categories()->attach($category);最后在销毁 Post 模型时,只需解除与标签和类别的关系,而不是使用detach 像这样的方法删除它们public function destroy(Post $post){   $post->categories()->detach();   $post->tags()->detach();   $post->delete();   return redirect('admin/post')->with('message','Deleted Sucessfully');}
打开App,查看更多内容
随时随地看视频慕课网APP