Мягкое удаление на промежуточной таблице для отношений "многие-ко-многим"
Как установить мягкое удаление на промежуточной таблице, которая соединяет два разных типа объектов? Я добавил столбец deleted_at, но документы говорят, что мне нужно поместить это в модель:
protected $softDelete = true;
Конечно, у меня нет модели для промежуточной таблицы.
Любая идея?
Ответы
Ответ 1
Вы можете установить ограничение на 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()')));
Ответ 2
Насколько я понимаю; промежуточная таблица - это просто длина строки, прикрепляющая одну таблицу к записи в другой таблице, и поэтому она не требует метода мягкого удаления.
Чтобы объяснить, представьте, что у вас есть таблица "Пользователи" и таблица "Группы", каждый пользователь может иметь более одной группы, и каждая группа может принадлежать более чем одному пользователю. Ваша сводная таблица может быть User_Group
или что-то вроде этого, и она просто содержит два столбца user_id
и group_id
.
В таблице User
и таблице Group
должен быть столбец deleted_at
для мягких удалений, поэтому, когда вы "удаляете" команду "группа", эта групповая ассоциация не будет отображаться в $User->Groups()
, в то время как строка сводной таблицы имеет остался незатронутым. Если вы затем восстановите удаленную группу, она снова появится в $User->Groups()
.
Строка таблицы сводной таблицы должна быть затронута только в том случае, если эта групповая запись сильно удалена, и в этом случае строковые строки также должны быть удалены.
Теперь я объяснил, почему я не считаю, что вам нужно добавить мягкое удаление в сводную таблицу; есть ли еще причина, по которой вам нужно это поведение?
Ответ 3
Вы также можете использовать метод Laravel Eloquent BelongsToMany updateExistingPivot
.
$model->relation->updateExistingPivot($relatedId, ['deleted_at' => Carbon\Carbon::now()]);
Итак, чтобы использовать примеры @RonaldHulshof, у вас есть модель User с отношением групп, которое является отношением toMotMany.
public function groups() {
return $this->belongsToMany(Group::class)->whereNull('groups_users.deleted_at')->withTimestamps();
}
Затем, чтобы мягко удалить запись сводной таблицы, вы должны сделать следующее.
$user->groups->updateExistingPivot($groupId, ['deleted_at' => Carbon\Carbon::now()]);