32

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

protected $softDelete = true;

当然,我没有中间表的模型。任何的想法?

4

3 回答 3

76

您可以对 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`

    }

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

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

你应该使用这样的东西来软删除:

DB::table('group_user')
    ->where('user_id', $user_id)
    ->where('group_id', $group_id)
    ->update(array('deleted_at' => DB::raw('NOW()')));
于 2013-08-09T10:47:49.467 回答
17

你也可以使用 Laravel 的 EloquentBelongsToMany方法updateExistingPivot

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

因此,要使用@RonaldHulshof 示例,您有一个具有组关系的用户模型,这是一种belongsToMany关系。

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

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

$user->groups()->updateExistingPivot($groupId, ['deleted_at' => Carbon\Carbon::now()]);
于 2017-06-06T21:21:35.883 回答
3

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

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

您的User表和Group表应该有一个deleted_at用于软删除的列,因此当您“删除”一个组时,该组关联不会出现在$User->Groups()数据透视表行不受影响的情况下。如果您随后恢复该已删除的组,它将再次出现在$User->Groups().

只有当该组记录被硬删除时,透视表行才会受到影响,在这种情况下,透视表行也应该被硬删除。

现在我已经解释了为什么我认为您不需要向数据透视表添加软删除;你还有理由需要这种行为吗?

于 2013-08-09T09:47:33.537 回答