Подтвердить что ты не робот

Мягкое удаление на промежуточной таблице для отношений "многие-ко-многим"

Как установить мягкое удаление на промежуточной таблице, которая соединяет два разных типа объектов? Я добавил столбец deleted_at, но документы говорят, что мне нужно поместить это в модель:

protected $softDelete = true;

Конечно, у меня нет модели для промежуточной таблицы. Любая идея?

4b9b3361

Ответ 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()]);