LoginSignup
5
4

More than 5 years have passed since last update.

【Laravel】ソフトデリートしたモデルの取得

Posted at

参考:https://readouble.com/laravel/5.3/ja/eloquent.html

普通の削除方法

Flight.php
$flight = App\Flight::find(1);

$flight->delete();

ここは問題ないですね。
id=1を削除したい時はfindでモデルを検索して、delete()で削除

ソフトデリートとは

ソフトデリートは実際にDBからレコードを削除せずに、削除したように見せかける技です。
deleted_atカラムに日時を追加することで、検索できないようになります。
通常はnullにすることで表示対象になります。

ソフトデリート方法

Flight.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Flight extends Model
{
    use SoftDeletes;

    /**
     * 日付へキャストする属性
     *
     * @var array
     */
    protected $dates = ['deleted_at'];
}

参考からのコピペですが、これは必ず必要みたいです。

create_table.~
Schema::table('flights', function ($table) {
    $table->softDeletes();
});

デリートカラムを追加します。

あとは通常のデリートと同じくdelete()で削除するとソフトデリートできるらしい。
簡単!

ソフトデリート済みモデルを取得したい

削除はしたけど過去の情報は残しておきたい。そんな時も大丈夫。

$flights = App\Flight::withTrashed()
                ->where('account_id', 1)
                ->get();

これでアカウントID=1の人の過去のフライト情報を取得することができるんですね。

$flight->history()->withTrashed()->get();

リレーションしていても使える

デリートされたモデルのみ取得

$flights = App\Flight::onlyTrashed()
                ->where('airline_id', 1)
                ->get();

ソフトデリートの復活

ソフトデリートにする目的として復活させたいというのがあります。
削除したアカウントの情報を保持しておけば、再登録した時に途中から始めることができます。

$flight->restore();

これだけみたいです。

今回使いたかった機能はこれだけなのでこれ以上は書きませんが、参考URLにはもっと詳しく書いてあります。

5
4
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
5
4