Laravel 軟刪除所有坑 - 持續更新

vimkid發表於2021-03-19

描述

很多時候,我們為了確保不丟失業務資料,會使用軟刪除的方法刪除資料。
使用軟刪除的方法:
migrate檔案:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class Test extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('test', function (Blueprint $table) {
            $table->increments('id');
            // .. 等等其他欄位
            $table->softDeletes();
        });
    }

}

Models:

<?php
use Illuminate\Database\Eloquent\Model;
class Test extends Model
{
    use SoftDeletes;

目前發現的問題及解決方法

問題1: 帶唯一索引的軟刪除

程式碼模型和欄位新增了軟刪除deleted_at,同時表又新增了唯一欄位(如手機號),軟刪以後,別人重新新增這個唯一欄位(如手機號)將無法新增資料,因為記錄還在,只是deleted_at 賦了時間值 。

  • 方法一: 如果庫表如果有唯一索引欄位,插入時或查詢是否有值時請自行呼叫withTrashed方法進行包含deleted_at 判斷軟刪除是否有唯一索引欄位值。
  • 方法二: 表欄位不新增唯一索引, 通過業務控制唯一性。
  • 方法三: 唯一欄位和軟刪除欄位deleted_at 建立聯合唯一。
  • 方法四: 如果必須要使用唯一鍵控制又不聯合deleted_at 唯一,放棄使用軟刪除。
  • 方法五: 參照下方評論,有很多牛人提出瞭解決辦法和寫了方法包。
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章