Để giải quyết vấn đề này, tôi sử dụng bitmask để lưu trữ các ngày trong tuần.
Tôi đã thay đổi nội dung mảng các ngày trong tuần thành một thứ như thế này:
$days = [
8, // Wednesday
16, // Thursday
64, // Saturday
];
Sử dụng danh sách này làm tài liệu tham khảo:
1 : Sunday
2 : Monday
4 : Tuesday
8 : Wednesday
16 : Thursday
32 : Friday
64 : Saturday
Sau đó, tôi đã thêm một TINYINT
để giữ mặt nạ bit các ngày trong tuần. Khi lưu trữ các giá trị trong cơ sở dữ liệu, tôi chỉ cần sử dụng như sau:
$valueToMySQL = array_sum($days); // 88, with the sample above
Để tìm kiếm các hàng có một ngày trong tuần cụ thể, chẳng hạn như Thứ Bảy, tôi có thể sử dụng điều kiện sau:
... WHERE `weekdays` & 64;
Lấy các ngày trong tuần từ cơ sở dữ liệu dưới dạng một mảng ít đơn giản hơn một chút. Tôi đang sử dụng logic sau:
$days = [];
$bitmask = strrev(decbin($valueFromMySQL));
for ($i = 0, $s = strlen($bitmask); $i < $s; $i++) {
if ($bitmask{$i}) {
$days[] = pow(2, $i);
}
}
Nếu tôi cần truy xuất tất cả các hàng có cùng ngày trong tuần với ngày hiện tại, tôi có thể chuyển ngày trong tuần hiện tại sang điều kiện SQL trước đó như sau:
$weekday = (int) date('w'); // 0 for Sunday, to 6 for Saturday
$weekdayToMySQL = pow(2, $weekday); // 1 - 64
Sau đó:
... WHERE `weekdays` & {$weekdayToMySQL};