在排程或班表管理的系統中,常會遇到這樣的需求:將前一天的排程資料複製到今天或任意指定日期,例如將 2025-05-09 的班表複製到 2025-05-10。

本教學將介紹如何使用 Laravel 的 Eloquent ORM 搭配 Schedule 模型,完成下列流程:

功能說明

  1. 接收使用者輸入的目標日期(如:2025-05-10

  2. 自動取得前一天的日期(如:2025-05-09

  3. 先刪除資料表中 date = 2025-05-10 的資料(避免重複)

  4. 複製前一天的排程資料到目標日期

範例程式碼

use Illuminate\Http\Request;
use App\Models\Schedule;

public function copyYesterday(Request $request)
{
    // 取得使用者指定的目標日期
    $date = $request->input('date'); // 例如 '2025-05-10'

    // 計算前一天日期
    $yesterday = date('Y-m-d', strtotime($date . ' -1 day'));

    // 步驟 1:刪除目標日期的舊資料
    Schedule::where('date', $date)->delete();

    // 步驟 2:取得前一天的資料
    $schedules = Schedule::where('date', $yesterday)->get();

    // 步驟 3:逐筆複製並改日期為目標日
    foreach ($schedules as $schedule) {
        $newSchedule = $schedule->replicate(); // 複製模型(不含主鍵)
        $newSchedule->date = $date;            // 設定新日期
        $newSchedule->save();                  // 儲存新資料
    }

    return response()->json(['message' => '資料已成功複製'], 200);
}

 

實作注意事項

  • 日期格式要求:建議使用 Y-m-d 格式(如:2025-05-10),以確保 strtotime() 正常運作。

  • 資料檢查建議

    • 若無前一天資料,則不進行任何複製。

    • 若目標日期已有資料,可提示使用者確認是否覆蓋。

  • 資料庫最佳化:若複製資料筆數龐大,考慮使用批次 insert() 寫入以提升效能。