删除口才的第二层归属

时间:2019-02-24 14:41:55

标签: laravel eloquent

我的应用程序具有Category模型。每个Category可以有多个Subcategories,因此每个Subcategory belongsTo和一个Category。在Subcategory模型中:

public function category()
{
    return $this->belongsTo('App\Category');
}

另一方面,有一个Friend模型。现在,每个Friend/Subcategory对都通过枢轴friend_score表连接:

id | friend_id | subcategory_id | score

通过Subcategory模型:

/**
 * The friend scores that belong to the subcategory.
 */
public function friends()
{
    return $this->belongsToMany('App\Friend', 'friend_score')->withPivot('score');
}

通过Friend模型:

/**
 * The subcategory scores that belong to the friend.
 */
public function subcategories()
{
    return $this->belongsToMany('App\Subcategory', 'friend_score')->withPivot('score');
}

当我删除一个子类别时,Eloquent会自动正确地从{_1}}的friend_score表中删除条目。

删除类别时,它会正确删除属于该subcategory_id的子类别。但是,在这种情况下,相关的friend_scores仍保留在数据库中。

在删除类别时,如何使它删除每个子子类别的friend_score?

我知道我可以手动遍历它们并删除它们,但是我想知道是否存在一种通过模型关系自动实现此目的的方法。

2 个答案:

答案 0 :(得分:0)

friend_score迁移中,您可以将subcategory_id定义为外键。然后,您可以选择在删除子类别后使用onDelete()方法对记录进行透视的操作。

$table->foreign('subcategory_id')
      ->references('id')
      ->on('subcategories')
      ->onDelete('cascade');

使用层叠选项,当删除子类别时,所有相关的数据透视记录将被删除。

因此,当您删除类别时,删除将通过子类别冒泡给朋友分数

类别->子类别->朋友得分(枢轴)

答案 1 :(得分:0)

您可以更新迁移并添加onDelete()级联,这将是我处理此类情况的首选方式。但是,如果您真的希望手动执行此操作,则可以使用如下雄辩的事件:

Subcategory型号:

/**
 * Boot eloquent model events
 * 
 * @return void
 */
public static function boot() {

    parent::boot();

    // This will be called just before deleting a
    // subcategory entry

    static::deleting(function($subcategory) {

        Friend::where('subcategory_id', $subcategory->id)->delete();
    });
}

在执行任何操作之前,您可以按照以下步骤进行清理:

Friend::whereDoesntHave('subcategories')->get();

检查以上内容是否返回与子类别表没有任何关系的条目的正确结果。然后,您可以调用->delete()而不是->get()来清理好友模型条目。