## 目的
- 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の判定に関しては条件の記載方法が変わることに注意する。
-