Laravel cung cấp một tính năng tích hợp cho phép chúng ta gắn cờ các hàng cơ sở dữ liệu là đã xóa mà không thực sự xóa chúng khỏi cơ sở dữ liệu. Bài viết này thảo luận về cách chúng ta có thể bắt đầu sử dụng chúng
Tại sao tôi nên sử dụng Xóa mềm?Như chúng ta đã thảo luận trong phần “Dừng xóa dữ liệu”, khi chúng tôi xóa một hàng khỏi cơ sở dữ liệu, nó sẽ biến mất vĩnh viễn mà không cần trải qua quá trình khôi phục cơ sở dữ liệu đầy đủ có thể gây đau đớn. Xóa mềm dữ liệu cho phép bạn dễ dàng khôi phục dữ liệu với công việc tối thiểu và có thể tiết kiệm thời gian rất nhiều khi người dùng vô tình xóa một số dữ liệu
Laravel cung cấp hỗ trợ xóa mềm bằng cách sử dụng đặc điểm Illuminate\Database\Eloquent\SoftDeletes
Phần đầu tiên của quy trình mà chúng ta cần giải quyết là thiết lập các bảng cơ sở dữ liệu để có cột SoftDeletes
Thêm các cột xóa mềm vào một bảng mới
Hãy bắt đầu bằng cách tạo một mô hình mới để theo dõi `Dự án` trong ứng dụng quản lý dự án của chúng ta. Chúng tôi sẽ tạo mô hình và di chuyển trong một bước để chúng tôi có thể lười biếng nhất có thể
Bây giờ khi chúng tôi mở di chuyển mới được tạo, chúng tôi sẽ thêm các dòng sau vào hàm up[]
của chúng tôi
Nó trông như thế này
Lệnh gọi hàm $table->softDeletes[];
là thứ thiết lập bảng để cho phép đặc điểm SoftDeletes
hoạt động. Không có nó, chúng tôi sẽ gặp lỗi truy vấn
Bây giờ chúng tôi sẽ chạy di chuyển
Hãy xem bảng trông như thế nào bên trong MySQL
Như chúng ta có thể thấy có một cột deleted_at
trong định nghĩa bảng. Đây là những gì cuộc gọi $table->softDeletes[];
được thêm vào bảng và những gì mà đặc điểm SoftDeletes
sẽ sử dụng để theo dõi nếu hàng đã bị xóa
Thêm các cột xóa mềm vào một bảng hiện có
Hãy xem cách chúng ta có thể thêm các cột xóa mềm vào một bảng hiện có. Chúng tôi sẽ tạo một di chuyển mới bằng cách sử dụng `make. lệnh migration` để thêm các cột vào bảng users
vì ngoài hộp Laravel không có cột này trên bảng users
Tiếp theo, chúng ta sẽ thay đổi quá trình di chuyển để nó vừa thêm các cột trong hàm up[]
[$table->softDeletes[];
] vừa xóa chúng trong hàm Illuminate\Database\Eloquent\SoftDeletes
3 [Illuminate\Database\Eloquent\SoftDeletes
4]
Một lần nữa, chúng tôi sẽ chạy di chuyển
hùng biệnThiết lập mô hình để sử dụng xóa mềm
Bây giờ chúng ta đã thiết lập các bảng cơ sở dữ liệu, chúng ta có thể bắt đầu làm việc với các mô hình đã xóa mềm trong mã của mình. Bước đầu tiên là thêm đặc điểm Illuminate\Database\Eloquent\SoftDeletes
vào các mô hình. Dưới đây là một mô hình ví dụ mà chúng tôi đã thiết lập nó để sử dụng logic SoftDeletes
Điều quan trọng cần lưu ý là mặc dù chúng tôi đã thêm cột SoftDeletes
vào mô hình của mình nhưng Laravel không tự động sử dụng nó cho đến khi chúng tôi thêm đặc điểm, vì vậy chúng tôi vẫn sẽ xóa dữ liệu mà không có nó.
Xóa một mô hình
Bây giờ mọi thứ đã được thiết lập, hãy kiểm tra xem điều gì sẽ xảy ra
Trước tiên, chúng tôi sẽ sử dụng tinker để tạo một `Dự án` mới
Khi chúng tôi kiểm tra cơ sở dữ liệu, chúng tôi có thể thấy rằng nó đã được lưu vào cơ sở dữ liệu và cột deleted_at
được đặt thành Illuminate\Database\Eloquent\SoftDeletes
9 cho biết rằng nó chưa bị xóa
Bây giờ chúng ta sẽ xóa mô hình
Và quay lại MySQL, chúng ta có thể thấy deleted_at
không còn là Illuminate\Database\Eloquent\SoftDeletes
9, điều này cho biết nó đã bị xóa
Khôi phục một mô hình
Nếu bạn vô tình xóa mô hình, Laravel giúp bạn dễ dàng khôi phục bản ghi bằng cách sử dụng chức năng SoftDeletes
2
Xóa một mô hình
Giả sử bạn gặp trường hợp ai đó vô tình nhập thông tin và chúng tôi cần xóa bản ghi khỏi cơ sở dữ liệu. SoftDeletes
cung cấp chức năng SoftDeletes
4 sẽ làm việc đó
Tìm một mô hình đã xóa
Điều gì xảy ra khi chúng ta xóa một mô hình và cần tìm nó sau?
Đầu tiên, hãy thiết lập một SoftDeletes
5 mới và xóa nhẹ nó
Khi chúng tôi cố gắng sử dụng SoftDeletes
6, chúng tôi sẽ nhận được một SoftDeletes
7 vì đặc điểm của SoftDeletes
đang lọc chúng ra
Để giải quyết vấn đề này, chúng ta cần gọi hàm SoftDeletes
9 trước khi gọi hàm SoftDeletes
6
Tìm một mô hình đã xóa trong một mối quan hệ
Một phần khác trong mã của chúng tôi mà chúng tôi cần chú ý là khi chúng tôi có một mô hình xác định mối quan hệ Eloquent với các mô hình SoftDeletes
Thông thường, chúng tôi sẽ xác định mối quan hệ của chúng tôi như vậy
Nếu up[]
2 được liên kết với SoftDeletes
5 này bị xóa mềm và chúng tôi cố gắng truy cập nó thông qua mối quan hệ này, hàm sẽ trả về Illuminate\Database\Eloquent\SoftDeletes
9