Дата публикации: 15.11.2025 в 11:33

Soft Deleting в MoonShine v4+

Анатолий ШевелевАнатолий Шевелев
0 комментария

Данная статья является адаптацией предыдущей статьи для MoonShine v4 и выше.

Рекомендую предварительно изучить соответствующий раздел документации Laravel и подготовить модель к реализации функции "мягкого удаления".

Переопределим метод modifyItemQueryBuilder()в ресурсе для корректного получения "удаленной" модели.

protected function modifyItemQueryBuilder(
    Builder $builder
): Builder
{
    return $builder->withTrashed();
}

Затем добавим весь необходимый функционал в класс индексной страницы.

protected function queryTags(): array
{
    return [
        QueryTag::make(
            'Deleted',
            static fn(Builder $q) => $q->onlyTrashed()
        )
    ];
}

protected function buttons(): ListOf
{
    return parent::buttons()->prepend(
        ActionButton::make('Restore')
            ->method(
                'restore',
                events: [$this->getListEventName()]
            )
            ->canSee(
                fn(Article $model) => $model->trashed()
            ),
        ActionButton::make('Force delete')
            ->method(
                'forceDelete',
                events: [$this->getListEventName()]
            )
            ->canSee(
                fn(Article $model) => $model->trashed()
            ),
    );
}

#[AsyncMethod]
public function restore(
    CrudRequestContract $request
): JsonResponse
{
    $item = $request->getResource()->getItem();
    $item->restore();
    return JsonResponse::make()
        ->toast('Success');
}

#[AsyncMethod]
public function forceDelete(
    CrudRequestContract $request
): JsonResponse
{
    $item = $request->getResource()->getItem();
    $item->forceDelete();
    return JsonResponse::make()
        ->toast('Success');
}

protected function modifyDeleteButton(
    ActionButtonContract $button
): ActionButtonContract
{
    return $button->canSee(
        fn(Article $model) => !$model->trashed()
    );
}

protected function modifyMassDeleteButton(
    ActionButtonContract $button
): ActionButtonContract
{
    return $button->canSee(
        fn() => request()->input('query-tag') !== 'deleted'
    );
}

Готово!

ОбщайсяРазвивайсяУчисьРаботай
ОбщайсяРазвивайсяУчисьРаботай
ОбщайсяРазвивайсяУчисьРаботай
ОбщайсяРазвивайсяУчисьРаботай