Truy vấn datime trong laravel
Mình có 1 bảng table_otp ( id, code, created_at) . và có tạo 1 cronjob cứ 1 phút thì xử lý 1 lần để kiểm tra xem bản ghi nào > 5 phút sẽ xóa bản ghi đó đi ( chỉ cho phép tồn tại 5 phút rồi tự hủy). mình có tham khảo vài cách xử lý datetime nhưng chưa tìm được cách nào hợp lỹ lắm. Bạn nào cho mình lời khuyên với. Thanks.
4 CÂU TRẢ LỜI
Bạn lấy thời gian hiện tại trừ đi 5 phút . rồi so sánh với trường created_at nếu created_at nó nhỏ hơn thì thực hiện xóa bản ghi đó. Bạn có thể tham thảo câu truy vấn này:
Model::where('created_at', '<', \Carbon\Carbon::now()->subMinutes(5))->delete();
Hợp lý, cảm ơn bạn.
Thay vì cho chạy cron job 1 phút/lần, một cách tốt hơn là thêm một trường tên expires_at (bằng now() + 5 phút) cho bảng table_otp của bạn và check cái trường này lúc xác nhận otp xem đã bị vượt quá chưa.
Sau đó bạn vẫn cần cron job để dọn dẹp, nhưng chỉ cần chạy nó 1 tuần/lần thôi thay vì mỗi phút, hiệu năng sẽ ổn hơn nhiều.
Ý tưởng rất hay, cảm ơn bạn hỗ trợ.
Theo mình hiểu thì bạn đang làm chức năng tạo mã otp và nó chỉ có hiệu lực trong 5', mình nghĩ có thể thêm 1 trường expired_at = created_at + 5' và khi truy vấn thì thêm điều kiện created_at <= now() <= expired_at là được.
Không biết làm như thế có đúng với yêu cầu của bạn không nhưng mình nghĩ như thế sẽ đơn giản hơn là chạy cronjob 1 phút 1 lần!
Đúng chuẩn ý luôn, cảm ơn bạn.
Bạn lấy thời gian trong created_at rồi cộng thêm 5 phút nếu nó lớn hơn thời gian hiện tại thì bạn thực hiện xóa bản ghi đó (Có thể sử dụng carbon để tính thời gian và lấy thời gian hiện tại)
Cái này viết truy vấn kiểu gì được bạn?
@tinhtn89 =)) tương tự với bạn trừ đi 5 phút, nhỏ hơn phía trên kìa. còn trường hợp t là cộng thêm, lớn hơn thôi :v
khác chứ, created_at làm sao bạn cộng thêm được, nó là trường dữ liệu mà.
@tinhtn89 =)) cách trừ thì nó ngắn gọn hơn còn cộng thì dài hơn bạn phải lấy dữ liệu ra rồi mới so sánh create_at rồi mới xóa chứ
ừ, cách của ban phải lấy dữ liệu ra rồi mới so sánh sau đó mới xóa , nên mình mới bảo là khó viết truy vấn sql mà.