みなさんこんにちは、エンジニアのオータケです!
今回はLaravelを使ったデータベース内のデータ削除についてお話をしたいと思います。
まずデータの削除方法が2つあることを皆さんはしっていますか?
「え?データの削除方法って一つじゃないの?」
「2種類あるのは知っているけど、Laravelでの書き方がわからない」
といった方は必見です!
本記事では
[基本]論理削除と物理削除の違い
[基本]論理削除を意識したマイグレーションファイルの編集
[実践]データ削除の方法
について解説をしていきます。
データの削除はWebアプリケーションを作る上でよく出てくる話でもあるので皆さんしっかり学んでいきましょう!
Laravelとは?
まず、「Laravelが何かわからない」という方もいるかと思います。
そういった方にはLaravelとは何かをとても詳しく解説した記事がありますので次の記事をご覧ください。
この記事を読んでいただければ「今、流行りのLaravel」について知ることができますよ!
Laravelとは?PHPの主流WEBフレームワークを徹底解説
更新日 : 2020年3月9日
よく聞く「論理削除(SoftDelete)」と「物理削除(HardDelete)」
そもそも論理削除と物理削除とは?
まず論理削除と物理削除の違いについて説明をしたいと思います。
言葉を見る限りとても難しく感じそうですが、至って簡単です。
わかりやすく一言で表せば、
論理削除・・・実際にはデータは消えてないが、表面的に消えたことにしてしまう
物理削除・・・実際にデータを削除する
という違いがあります。
これらにどういった違いがあるかというと、ある掲示板があったとします。
書き込みを削除したけどあとからやっぱり書き込みを復活させたい、間違って削除してしまったという場合には論理削除を用います。
逆に完全にデータを削除しておきたいという場合には物理削除を用います。
Laravelの場合、特に何も設定をしなければ物理削除でデータを削除します。
もし、論理削除をしたい場合は次の項から見ていってください。
物理削除の場合は「実際に削除してみる」からでも構いません。
まずはマイグレーションファイルから
論理削除を行いたい場合はテーブルの構造を変える必要があるため、Laravelでプロジェクトを作った際にデフォルトで生成されるXXXXX_create_users_table.phpを変える必要があります。
(XXXXXは日付)
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateUsersTable extends Migration
{
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->rememberToken();
$table->softDeletes();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('users');
}
}
このコードでデフォルトで生成されるコードとの違いが一箇所あります。
どこだかわかりますか?
$table->softDeletes()というメソッドを呼び出しているところがあるかと思いますがこのメソッドを呼び出すことでマイグレーション時にテーブル内に削除されたか削除されていないかを判断できるカラムが追加されることになっています。
ちなみにこの削除されたか削除されていないかのカラムですが特に指定がなければdeleted_atが自動的に作られる仕組みになっています。
この行を追加したらマイグレーション作業を行ってテーブル構造をリフレッシュしてみましょう。
実際に削除してみる
この項では先程マイグレーションした内容をもとに実際にデータを削除してみます。
論理削除の場合はモデルに少し設定の追記が必要です。
といっても、3行文追加するだけで大丈夫です。
では論理削除に対応したUserモデルを見てみましょう!
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Database\Eloquent\SoftDeletes;
class User extends Authenticatable
{
use Notifiable;
use SoftDeletes;
protected $dates = [ 'deleted_at' ];
protected $fillable = [
'name', 'email', 'password',
];
protected $hidden = [
'password', 'remember_token',
];
}
ここからはデータの削除方法なので論理・物理削除共通になります。
例えば、特定のユーザーを削除したい場合
$user = App\User::find(1);
$user->delete();
とすることで削除することが可能です。
論理削除したデータも含めて取得する
最後に論理削除したデータを含めて取得する際にはどういった処理を書けばよいでしょうか?
これも簡単です。
withTrashedメソッドを使うことで実現できます。
App\User::withTrashed()->where('id', '>', 100);
このコードの場合はusersテーブルのIDが100よりも大きい論理削除済みを含めたデータを取得するという内容になっています。
まとめ
いかがだったでしょうか?
論理削除と物理削除の意味から実際に削除する方法まで解説をしました。
自分の作成しているサービスに沿って、論理削除と物理削除を使い分けていく必要があるかと思います。
Laravelはとても便利なのでこういった機能が少ない記述量で実現することができます。
どんどん覚えて使っていきましょう!