在排程或班表管理的系統中,常會遇到這樣的需求:將前一天的排程資料複製到今天或任意指定日期,例如將 2025-05-09 的班表複製到 2025-05-10。
本教學將介紹如何使用 Laravel 的 Eloquent ORM 搭配 Schedule
模型,完成下列流程:
功能說明
-
接收使用者輸入的目標日期(如:
2025-05-10
) -
自動取得前一天的日期(如:
2025-05-09
) -
先刪除資料表中
date = 2025-05-10
的資料(避免重複) -
複製前一天的排程資料到目標日期
範例程式碼
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()
寫入以提升效能。