为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
繁星淼淼 2021-12-03 19:18:11
我有五个表:邮政类别标签category_postpost_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');}但得到了相同的结果
查看完整描述

1 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

在 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');

}


查看完整回答
反对 回复 2021-12-03
  • 1 回答
  • 0 关注
  • 296 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信