Laravel雄辩的ORM-多对多删除遗留的数据透视表值

Laravel雄辩的ORM-多对多删除遗留的数据透视表值,laravel,orm,many-to-many,eloquent,Laravel,Orm,Many To Many,Eloquent,使用Laravel,我有以下代码 $review = Review::find(1); $review->delete(); Review与产品实体定义了多对多关系。删除评论时,我希望它与透视表中的关联产品分离,但事实并非如此。当我运行上面的代码时,我仍然可以在pivot表中看到链接行 // Part of a database migration $table->foreign('product_id')->references('id')->on('products

使用Laravel,我有以下代码

$review = Review::find(1);
$review->delete();
Review
产品
实体定义了多对多关系。删除评论时,我希望它与透视表中的关联产品分离,但事实并非如此。当我运行上面的代码时,我仍然可以在pivot表中看到链接行

// Part of a database migration
$table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');
$table->foreign('review_id')->references('id')->on('reviews')->onDelete('cascade');
我是不是错过了什么?还是拉威尔就是这样工作的?我知道
detach()
方法,但我认为删除实体也会自动将其与任何相关实体分离

Review
的定义如下:

<?php
class Review extends Eloquent
{
    public function products()
    {
        return $this->belongsToMany('Product');
    }
}
<?php
class Product extends Eloquent
{
    public function reviews()
    {
        return $this->belongsToMany('Review');
    }
}

提前感谢。

分离方法用于从透视表中释放关系,而delete将删除模型记录本身,即reviews表中的记录。我的理解是delete不会隐式触发分离。但是,您可以使用触发透视表的清理,方法如下:

Review::deleting(function($review)
{
    $review->product()->detach()
}
另外,我建议这种关系应该是一对多的,因为一个产品会有很多评论,但一个评论不会属于很多产品(通常)


当然,这需要调整数据库结构。如果希望保持数据库结构和当前关系不变,另一个选项是在透视表上应用外键约束,这样在删除审阅或产品时,可以在透视表上级联删除

// Part of a database migration
$table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');
$table->foreign('review_id')->references('id')->on('reviews')->onDelete('cascade');

编辑:在添加约束时,您可以将清理工作推到数据库上,而不必担心在代码中处理它。

更简单的步骤:

在本例中,
帐户
有许多
标记

要删除标记,请帐户执行以下操作:

// delete the relationships with Tags (Pivot table) first.
$account->find($this->accountId)->tags()->detach();

// delete the record from the account table.
$account->delete($this->accountId);
在数据透视表上,确保有->onDelete('cascade')

$table->integer('account_id')->unsigned()->index();
$table->foreign('account_id')->references('id')->on('accounts')->onDelete('cascade');

$table->integer('tag_id')->unsigned()->index();
$table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade');
$review->product()->sync([])
也可以工作


但是,
$review->product()->detach()
要明确得多。

我猜您在模型关系概念中有一个错误,产品有很多评论,但是评论与一个产品关联,所以这里有一对多关系。 但一般情况下,一般情况下的答案是:

$product->reviews()->sync([]);

这就是
雄辩
的工作原理。您可以将DB事件用于数据透视表(
on delete cascade
),或者使用Eloquent实现事件处理程序。类似于在第一篇文章中,您不需要迭代结果,只需调用
$model->relation()->detach()
即可在单个查询中删除给定
$model
的所有枢轴关联。非常感谢。这完全回答了我的问题。顺便说一句,我有一个多对多的关系,因为我有一个现有的产品评论列表,一些人在一件作品中评论了多个产品。如果包含
detach()
语法和要分离的项的ID,以及链接或FK约束,这将是两种方法中最好的方法。让DB来处理这一切。“在数据透视表上应用外键约束,这样当一个评论或产品被删除时,您就可以在数据透视表上级联删除。”最后一部分正是a在另一个问题中寻找的,但找不到,谢谢。这个答案将删除产品所有评论的所有透视表行(假设关系真的是多对多,在这种情况下似乎有点奇怪)。它将保持产品及其评论完好无损,但不会链接。这是一件很好很有用的事情,但根本不能解决这个问题。