## 目的
- Laravelにて論理削除するための設定を行ったDBのテーブルに対するSQLのselect文にてすでに論理削除されたレコードを出力しないwhere条件をまとめる
実施環境
- ハードウェア環境
| 項目 | 情報 |
|---|---|
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |
- ソフトウェア環境
| 項目 | 情報 | 備考 |
|---|---|---|
| PHP バージョン | 7.4.3 | Homwbrewを用いて導入 |
| Laravel バージョン | 7.0.8 | commposerを用いてこちらの方法で導入→Mac Laravelの環境構築を行う |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いてこちらの方法で導入→Mac HomebrewでMySQLをインストールする |
前提条件
- 下記の作業を行い、現存するテーブルのレコード削除機能を物理削除から論理削除に変更する。
読後感
- SQL文でselect句を使用した際に論理削除されたレコードの情報を表示しないようにwhere句の条件が記載できる。
概要
- Laravel側からのデータ削除
- where句の条件の追加と実行
詳細
- Laravel側からのデータ削除
-
アプリ名ディレクトリで下記コマンドを実行してtinkerを起動する。
$ php artisan tinker -
下記の公式ドキュメントに従い任意のレコードを論理削除する。
>>> 変数A = App\論理削除を行うレコードが存在するテーブルのデータ操作を行うモデル名::find(削除するレコードのid); >>> 変数A->delete();
-
- where句の条件の追加と実行
-
下記コマンドを実行してMySQLにターミナルからログインする。(MySQLのrootユーザのパスワードを忘れてしまった方はこちら→Mac ローカル環境の MySQL 8.0 のrootパスワードを忘れた時のリセット方法)
$ mysql -u root -p -
下記を実行してこれから実行するSQL文がどのテーブルに対するものなのかを設定する。
use Laravelアプリに紐づいたDB名; -
下記を一旦実行してselect句を使用してusersテーブルの内容を出力する。(論理削除のレコードも出力される。)
select * from users; -
下記を実行して論理削除のレコードを除いたusersテーブルの内容を出力する。(deleted_atカラムがnullとして条件付けしたのはdeleted_atは論理削除された日時を格納するカラムなのでnullなら論理削除していないことになるためである。)
select * from users where deleted_at is null;
-
null判定の落とし穴
- nullは
=を使って判定できない。-
where deleted_at = null;などの条件だとnullは判定することができない。間違えやすいので注意する。
-
- nullの判定は
is nullもしくはis not nullを使用する。-
=での判定ができないためnullの判定に関しては条件の記載方法が変わることに注意する。
-
