“Мягкое” удаление связей многие-ко-многим в Laravel — как реализовать грамотно?
Поделитесь опытом - как вы реализуете "мягкое" удаление связей многие-ко-многим в Laravel?
Очень уж не хочется изобретать очередной велосипед :)
Хочется иметь возможность удалять связи (например, переключать при помощи toggle()), но при этом иметь возможность их отображения в виде истории, возможность возобновлять удаленное, и т.п.
JhaoDa, ну, на самом деле не всегда это зло. Например, удалять сообщения в чате, сохраняя при этом их для админов - почему бы и нет. Никаких unique, никакой валидации (почти) - никаких проблем)
В Pivot таблице можно сделать поле Active true/false. У меня так реализована деактивация ролей пользователя c возможностью их восстановления, отображения истории и т.д.
Так-то оно так... )) но, допустим, если я захочу использовать функцию toggle() для управления отношениями (у меня сейчас функционал через нее работает) - то она будет удалять или создавать записи в pivot-таблице.
То есть суть моего вопроса вот в чем: можно ли сделать такой функционал без костылей. Так, чтобы уже существующие функции остались в рабочем состоянии?
procode, насчет toggle() не знаю не использовал. У меня при рефакторинге были минимальные изменения. Код который выше для активации/деактивации. Запрос в модели
public function activeRoles()
{
return $this->roles()->wherePivot('active',true);
}
Это все изменения. Использую в модерации, работает как часы)
procode, единственное если метод запроса активно использовался то его либо переписывать, добавлять ->wherePivot('active',true)
в запрос и потом везде проверять. Либо новый метод писать (как у меня в примере) - и потом рефакторить с данным методом где нужно.
Роман, почему забыть? Active false – это мягкое удаление. Detach – фактическое. Active без Detach смысла не имеет. Ларавель не сможет сам понять, какое удаление от него требуют. В любом случае придется написать "хочу удалить мягко")