在中间表上进行软删除以获得多对多关系

时间:2013-06-27 17:55:26

标签: laravel laravel-4

如何在连接两种不同类型实体的中间表上设置软删除?我已经添加了deleted_at列,但文档说我需要将它放入模型中:

protected $softDelete = true;

当然,我没有中间表的模型。 有什么想法吗?

3 个答案:

答案 0 :(得分:53)

您可以在Eager Load上添加约束:

public function groups()
    {

        return $this
        ->belongsToMany('Group')
        ->whereNull('group_user.deleted_at') // Table `group_user` has column `deleted_at`
        ->withTimestamps(); // Table `group_user` has columns: `created_at`, `updated_at`

    }

而不是HARD使用以下方法删除关系:

User::find(1)->groups()->detach();

您应该使用类似这样的内容来删除SOFT:

DB::table('group_user')
    ->where('user_id', $user_id)
    ->where('group_id', $group_id)
    ->update(array('deleted_at' => DB::raw('NOW()')));

答案 1 :(得分:5)

你也可以使用Laravel的Eloquent BelongsToMany方法updateExistingPivot

$model->relation->updateExistingPivot($relatedId, ['deleted_at' => Carbon\Carbon::now()]);

因此,要使用@RonaldHulshof示例,您将拥有一个具有groups关系的User模型,该关系是belongsToMany关系。

public function groups() {
    return $this->belongsToMany(Group::class)->whereNull('groups_users.deleted_at')->withTimestamps();
}

然后,为了软删除数据透视表条目,您将执行以下操作。

$user->groups->updateExistingPivot($groupId, ['deleted_at' => Carbon\Carbon::now()]);

答案 2 :(得分:3)

据我了解;中间表只是将一个表记录附加到另一个表中的记录的字符串长度,因此它不需要软删除方法。

要解释一下,假设您有一个Users表和一个Groups表,每个用户可以拥有多个Group,每个Group可以属于多个User。您的数据透视表可能是User_Group或类似的内容,它只包含两列user_idgroup_id

您的User表和Group表应该有deleted_at列用于软删除,因此当您“删除”一个组时,该组关联不会出现在{{1当数据透视表行保持不受影响时。如果您随后还原了已删除的组,它将再次显示在$User->Groups()

如果该组记录被硬删除,则只应影响数据透视表行,在这种情况下,还应该硬删除数据透视表行。

现在我已经解释了为什么我不相信你需要在数据透视表中添加软删除;你还需要这种行为吗?