如何在连接两种不同类型实体的中间表上设置软删除?我添加了 deleted_at 列,但文档说我需要将其放入模型中:
protected $softDelete = true;
当然,我没有中间表的模型。任何的想法?
您可以对 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()')));
你也可以使用 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()]);
据我了解;中间表只是将一个表记录附加到另一个表中的记录的一段字符串,因此它不需要软删除方法。
解释一下,假设你有一个 Users 表和一个 Groups 表,每个用户可以有多个 Group,每个 Group 可以属于多个 User。您的数据透视表可能是User_Group
或类似的东西,它只包含两列user_id
和group_id
.
您的User
表和Group
表应该有一个deleted_at
用于软删除的列,因此当您“删除”一个组时,该组关联不会出现在$User->Groups()
数据透视表行不受影响的情况下。如果您随后恢复该已删除的组,它将再次出现在$User->Groups()
.
只有当该组记录被硬删除时,透视表行才会受到影响,在这种情况下,透视表行也应该被硬删除。
现在我已经解释了为什么我认为您不需要向数据透视表添加软删除;你还有理由需要这种行为吗?