#物理削除と論理削除
データベースの削除には物理削除と論理削除があります。言葉はどうでもいいのですが、2つには大きな違いがあります。
それは、復元可能かどうかということです。
この復元可能な削除、いわゆるゴミ箱に入っている状態にする削除方法が論理削除でソフトデリートになります。
#とりあえずデータベースを作る
データベースを作っていきましょう。
php artisan make:migration create_contents_table --create=contents
ここではcontentsテーブルを作成しています。
public function up()
{
Schema::create('contents', function (Blueprint $table) {
$table->increments('id');
$table->text('body');
$table->timestamps();
$table->softDeletes();
});
}
textデータ型で、bodyカラムを作っている単純なデータベースです。
最後の$table->softDeletes();
がポイントです。
このテーブルの要素に削除処理をするときはソフトデリートだよと、定義しています。
#付随したモデルを作る
次に、データベースに付随したモデルを作りましょう。
php artisan make:model Content
use Illuminate\Database\Eloquent\SoftDeletes;
class Content extends Model
{
use SoftDeletes;
protected $dates = ['deleted_at'];
protected $fillable = [
'body'
];
}
モデルでは、$fillable
でbodyをいじれるように設定しています。
use SoftDeletes
でソフトデリートを使用できるようにしており、削除した日がわかるように$dates
でdeleted_atカラムを作成しています。
ここまできたらmigrate
しましょう。
php artisan migrate
#中身が空なのでデータを入れる
現在は中身が空なので適当にデータを3つぐらい入れてみましょう。
use App\Content;
Route::get('/contents/insert', function() {
Content::create([
'body' => 'Laravel is PHP framework!!',
]);
});
Route::get('/contents/insert2', function() {
Content::create([
'body' => 'PHP is programming language!!',
]);
});
Route::get('/contents/insert3', function() {
Content::create([
'body' => 'programming is a lot of fun!!',
]);
});
これで指定のURLにアクセスするとデータが入ります。
いけてますね。deleted_at
は現在NULLになっています。
#ソフトデリートと取得
本題のソフトデリートをしてみましょう。
Route::get('/contents/softdelete', function() {
Content::find(1)->delete();
});
idが1の要素を削除します。
いけましたね。削除した日が表示されておりデータベースにはあるけど取得はできません。
次は削除した要素を取得しましょう。
Route::get('/contents/softdelete/get', function() {
$content = Content::onlyTrashed()->whereNotNull('id')->get();
dd($content);
});
いけていますね。
#他のメソッドも紹介
onlyTrashed()
は削除済みの要素のみ取得するメソッドですが他のメソッドもあります。
また完全削除や、復元のメソッドも紹介します。
//削除済みのデータも含める
Content::withTrashed()->whereNotNull('id')->get();
//完全削除
Content::onlyTrashed()->whereNotNull('id')->forceDelete();
//復元
Content::onlyTrashed()->whereNotNull('id')->restore();
#まとめ
早くlaravelを使いこなせるようになりたいです。。。