7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Laravel テーブル内のデータ削除を論理削除にする

Last updated at Posted at 2020-04-18

目的

  • Laravelの機能実装で論理削除を勉強したためまとめる

実施環境

  • ハードウェア環境
項目 情報
OS macOS Catalina(10.15.3)
ハードウェア MacBook Pro (16-inch ,2019)
プロセッサ 2.6 GHz 6コアIntel Core i7
メモリ 16 GB 2667 MHz DDR4
グラフィックス AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB
  • ソフトウェア環境
項目 情報 備考
PHP バージョン 7.4.3 Homwbrewを用いて導入
Laravel バージョン 7.0.8 commposerを用いて導入
MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いて導入

物理削除と論理削除

  • 物理削除
    • 一言で言うなら「消したいレコードを何も設定せずにdeleteメソッドやdestroyメソッドを実行してテーブルから削除する」こと
  • 論理削除(Soft delete)
    • 一言でいうなら「消したいレコードのデータ本体は残すが、削除したことにする」こと

前提情報

  • 本作業はカラム削除が物理削除(デフォルト状態)になっているものを論理削除に切り替える作業である。

概要

  • 紹介する方法はMacに直接環境構築を行い、そのローカル開発環境にてEloquantを用いた論理削除の方法
  1. マイグレーションファイルの作成
  2. カラム作成
  3. トレイト定義

詳細

  1. マイグレーションファイルの作成
    1. アプリ名ディレクトリで下記を実行してマイグレーションファイルを作成する。

      $ php artisan make:migration softdelete_テーブル名_table --table=テーブル名
      
    2. アプリ名ディレクトリ/detabase/migrations/YYYY_MM_DD_XXXXXX_softdelete_テーブル名_table.phpと言うファイルが作成される。

    3. アプリ名ディレクトリ/detabase/migrations/YYYY_MM_DD_XXXXXX_softdelete_テーブル名_table.phpを下記のように書き換える。

      アプリ名ディレクトリ/detabase/migrations/YYYY_MM_DD_XXXXXX_softdelete_テーブル名_table.php
      <?php
      
      use Illuminate\Database\Migrations\Migration;
      use Illuminate\Database\Schema\Blueprint;
      use Illuminate\Support\Facades\Schema;
      
      class SoftdeleteNoticesTable extends Migration
      {
          /**
           * Run the migrations.
           *
           * @return void
           */
          public function up()
          {
              Schema::table('テーブル名', function (Blueprint $table) {
                  //下記を追記
                  $table->softDeletes();
              });
          }
      
          /**
           * Reverse the migrations.
           *
           * @return void
           */
          public function down()
          {
              Schema::table('テーブル名', function (Blueprint $table) {
                  //下記を追記
                  $table->dropColumn('deleted_at');
              });
          }
      }
      
  2. カラム作成
    1. アプリ名ディレクトリで下記を実行してマイグレートを行い必要なカラムを作成する。

      $ php artisan migrate
      
  3. カラム確認(ターミナルからの確認方法を記載するがカラムが作成されている事を確認したいだけなので方法は問わない)
    1. 下記コマンドを実行してMySQLにターミナル側からログインする。(ログインパスワードを忘れた方はこちら→MySQL 8.0.18 のrootパスワードを忘れた時のリセット方法)

      $ mysql - u root -p
      
    2. 下記を実行してデータベースの一覧を取得する。

      mysql> show database;
      
    3. データベース一覧の出力からlaravelアプリで使用しているデータベースを確認し下記を実行する。

      mysql> use データベース名;
      
    4. 下記コマンドを実行してカラムの状況を出力する。

      mysql> show columns 
          -> from マイグレーションで変更を加えたテーブル名;
      
    5. 下記のような記載がある事を確認する。

      | deleted_at             | timestamp       | YES  |     | NULL    |                |
      
  4. トレイト定義
    1. マイグレーションで変更を加えたテーブルに紐づいているモデルファイルを開く。(モデルファイルはアプリ名ディレクトリ/app直下に存在する。)

    2. テーブルに紐づいているモデルファイルを開き、下記のように追記を行う。

      アプリ名ディレクトリ/app/モデル名.php
      <?php
      
      namespace App;
      
      use Illuminate\Database\Eloquent\Model;
      //下記を追記
      use Illuminate\Database\Eloquent\SoftDeletes;
      
      class NoticeContent extends Model
      {
          //下記を追記
          use SoftDeletes;
      }
      
    3. 上記までの作業が完了後、当該モデルでのdeleteメソッドやdestoryメソッドは物理削除ではなく、論理削除として扱われる。

  5. 論理削除したレコードを取得
    1. 論理削除を行ったレコードも含めて取得する際は下記をコントローラなどで記載する。

      $items = App\モデル名::withTreashed()->get();
      //コントローラの序盤でuseを用いてモデルを記載している場合は下記になる。
      $items = モデル名::withTreashed()->get();
      
    2. 論理削除を行ったレコードのみを取得する際は下記をコントローラなどで記載する。

      $deleted_items = App\モデル名::onlyTreashed()->get();
      //コントローラの序盤でuseを用いてモデルを記載している場合は下記になる。
      $deleted_items = モデル名::onlyTreashed()->get();
      
7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?