Laravel5.1の論理削除の考え方
1, 各テーブルの最後にdeleted_atという削除カラムがある(論理削除)
2, deleted_atの初期値はNULL、timestamp型
3, laravelのシステム上、削除したい場合は削除日時をupdate文で入れる(リアルタイムでOK)
4, $user->delete()で自動的に3を行ってくれる。delete文での削除は行わない
5, クラスの他メソッドは、今まで通りの使い方で論理削除したレコードを無視してくれる(無視しないメソッドも用意されている)
【下準備】
App\クラス名.phpで、論理削除を有効化する
1 2 3 4 5 6 7 |
use Illuminate\Database\Eloquent\SoftDeletes; // 追加する class クラス名 extends Model { // 論理削除を有効化 use SoftDeletes; protected $dates = ['deleted_at']; |
// クリエイトビルダでテーブル生成時に、削除カラムを一行追加する。
1 2 3 |
// database/migrations/yyyy_mm_dd_xxxxxx_create_テーブル名s_table.php // これで、deleted_atカラムが追加される $table->softDeletes(); |
上記の下準備をしないとDELETE文で実際に削除されてしまう!
1 2 3 4 5 6 7 |
public function destroy($id) { $user = User::findOrFail($id); // deleted_at = now()が入って、delete文で削除されない。 $user->delete(); return redirect()->to('/'); } |
【SQL文から論理削除する場合】
1 2 3 4 5 6 |
update テーブル名s set deleted_at = now() where id = 削除したいレコードID |
クラスの他メソッドは、今まで通りの使い方で論理削除したレコードはSELECT文の対象外になります。
また、リレーション関係の親レコードを削除したら、紐付いている子レコードの論理削除も出来ます
※users-postsのリレーションは設定済
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// User.phpに追加 public static function boot() { parent::boot(); // userレコードを削除したら static::deleted(function ($user) { // 関連している記事をループ foreach($user->articles as $article) { // 関連している記事を論理削除 $article->delete(); } }); // こちらは論理削除したUserレコードを復活された時の処理 static::restored(function ($user) { foreach($user->getTrashedArticles() as $article) { $article->restore(); } }); } |
参照URL
http://readouble.com/laravel/5/0/dev/ja/eloquent.html#soft-deleting