PHP Profi

Как создать корзину с мягким удалением в Laravel 8 и 7 Перевод

Всем привет! Я хотел бы рассмотреть некоторые концепции удаления в Laravel. Иногда нам может понадобиться спроектировать приложение так, чтобы в случае удаления пользователем данных, они не удалялись бы навсегда и все равно оставались в базе данных, но внешне не отображались. Laravel предоставил нам эту функцию "из коробки" под названием softDelete, поэтому я проиллюстрирую как удалить, просмотреть, восстановить и как навсегда удалить удаленные данные. Я назвал эту концепцию Корзиной (Recycle Bin).

Если вы предпочитаете видео, вы можете посмотреть видео на Youtube.

Шаг 1: Настройка приложения

  1. git clone https://github.com/Kingsconsult/laravel_8_crud.git
  2. cd laravel_8_crud/
  3. composer install
  4. npm install
  5. cp .env.example .env
  6. php artisan key:generate
  7. Добавьте конфигурацию вашей базы данных в файл .env
  8. php artisan migrate
  9. php artisan serve (если открывается сервер, http://127.0.0.1:8000, то мы готовы продолжать)localhost
  10. Перейдите на http://127.0.0.1:8000/projects

Шаг 2: Добавить столбец deleted_at в таблицу projects

В Soft Delete Laravel данные фактически не удаляются из базы данных, но к ним добавляется атрибут deleted_at, поэтому, когда мы запрашиваем данные из базы данных, Eloquent ищет данные с нулевым значением deleted_at и выдает их, но когда они имеют ненулевое значение deleted_at, обрабатывает их как удаленные.
Поэтому нам нужно добавить его и снова запустить нашу миграцию.
create migration file

Шаг 3: Добавить столбец deleted_at в файл миграции

Запуск команды на Шаге 2 создаст файл миграции в database/migrations/, отредактирует файл и добавит $table->softDeletes(); в функцию up(), а также $table->dropSoftDeletes(); в функцию down().  Наш файл миграции выглядит следующим образом:
migration file

Шаг 4: Снова запустить миграцию

Нам нужно снова запустить миграцию, чтобы новый столбец был добавлен в существующую таблицу

php artisan migrate

migration

Зайдя в нашу базу данных, вы увидите новый столбец, созданный со значениями Null


database

Шаг 5: Включить трейт SoftDeletes в модели

Перейдите в app/Models/Project.php и добавьте трейт мягкого удаления. Он скажет модели только добавить дату к уже удаленной модели, но не удалять ее навсегда.

use SoftDeletes;

Также, добавьте путь трейта сверху

use Illuminate\Database\Eloquent\SoftDeletes;

Шаг 6: Создать маршруты для получения всех удаленных проектов

Перейдите в routes/web.php и добавьте маршрут для получения всех удаленных проектов

Route::get('projects/deletedprojects', [ProjectController::class, 'getDeleteProjects'])->name('getDeleteProjects');

Шаг 7: Создайте метод контроллера

В нашем маршруте выше мы указали методы getDeletedProjects в классе ProjectController, поэтому мы создаем этот метод. Перейдите в app/Http/Controllers/ProjectController.php и добавьте его:

    public function getDeleteProjects() {
        $projects = Project::onlyTrashed()->paginate(10);

        return view('projects.deletedprojects', compact('projects'))
            ->with('i', (request()->input('page', 1) - 1) * 10);
    }

Из приведенного выше метода мы использовали Eloquent-функцию onlyTrashed(). Эта функция извлекает только модель с ненулевыми значениями deleted_at, поэтому она будет извлекать только удаленные проекты.

Шаг 8: Создать файл blade для просмотра всех удаленных проектов

Из нашего метода getDeletedProjects() выше, мы возвращаемся к представлению deletedprojects, поэтому нам нужно создать его, перейти к resources/views/projects/, создать файл deletedprojects.blade.php и скопировать индексную страницу, а затем отредактировать ее:

@extends('layouts.app')

@section('content')
    

Laravel 8 CRUD

 

@if ($message = Session::get('success'))

{{ $message }}

@endif @foreach ($projects as $project) @endforeach

No Name Introduction Location Cost Date Deleted Action
{{ ++$i }} {{ $project->name }} {{ $project->introduction }} {{ $project->location }} {{ $project->cost }} {{ date_format($project->deleted_at, 'jS M Y') }}  

{!! $projects->links() !!} @endsection

В столбце проекта action из приведенного выше кода мы добавили значок для восстановления удаленного файла - это удалит значение в deleted_at в таблице. Также мы добавили еще один значок для полного удаления проекта - это навсегда удалит проект из базы данных.

Далее, нам нужно создать функцию для восстановления удаленного проекта.

Шаг 9: Создать маршрут для восстановления удаленного проекта

Route::get('projects/deletedprojects/{id}', [ProjectController::class, 'restoreDeletedProjects'])->name('restoreDeletedProjects');

В нашем маршруте мы также указываем метод контроллера restoreDeletedProjects, поэтому мы направляемся к ProjectController и создаем этот метод.

Шаг 10: Создать метод контроллера для восстановления удаленного проекта

Перейдите в app/Http/Controllers/ProjectController.php и добавьте этот метод:

    public function restoreDeletedProjects($id) 
    {

        $project = Project::where('id', $id)->withTrashed()->first();

        $project->restore();

        return redirect()->route('projects.index')
            ->with('success', 'You successfully restored the project');
    }

Шаг 11: Создать маршрут для полного удаления проекта

Нам также нужно создать функционал, чтобы полностью удалить проект, который мы не хотим оставлять в базе данных, поэтому давайте создадим маршрут:

Route::get('projects/retoreprojects/{id}', [ProjectController::class, 'deletePermanently'])->name('deletePermanently');

Step 12: Create the Controller Method

    public function deletePermanently($id)
    {
        $project = Project::where('id', $id)->withTrashed()->first();

        $project->forceDelete();

        return redirect()->route('projects.index')
            ->with('success', 'You successfully deleted the project fromt the Recycle Bin');

    }

Вот и всё! Давайте протестируем нашу работу
Мы создали проекты,
index with all projects

Мы также добавили значок корзины, который приведет нас на страницу, на которой мы показываем все удаленные проекты. Затем мы удалили два проекта и перешли на страницу корзины


recycle page

restored project
 

Это проекты, которые мы удалили с индексной страницы. Здесь у нас есть два значка: один для восстановления удаленных проектов, а другой для окончательного удаления проекта из базы данных.

Мы восстановили проект, и теперь он возвращается на главную страницу. Затем, наконец, мы полностью удалили другой проект.


permanently deleting a project

Вы можете просмотреть весь код в репозитории на GitHub.

2020-12-03 оригинал

Последние посты

Комментарии

авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий