Untuk mengatasi masalah ini, saya akhirnya menggunakan bitmask untuk menyimpan hari kerja.
Saya mengubah isi array hari kerja menjadi seperti ini:
$days = [
8, // Wednesday
16, // Thursday
64, // Saturday
];
Menggunakan daftar ini sebagai referensi:
1 : Sunday
2 : Monday
4 : Tuesday
8 : Wednesday
16 : Thursday
32 : Friday
64 : Saturday
Kemudian saya menambahkan TINYINT
kolom untuk menampung bitmask hari kerja. Saat menyimpan nilai dalam database, saya cukup menggunakan yang berikut ini:
$valueToMySQL = array_sum($days); // 88, with the sample above
Untuk mencari baris dengan hari kerja tertentu, Sabtu misalnya, saya dapat menggunakan ketentuan ini:
... WHERE `weekdays` & 64;
Mengambil hari kerja dari database sebagai array sedikit kurang sederhana. Saya menggunakan logika berikut:
$days = [];
$bitmask = strrev(decbin($valueFromMySQL));
for ($i = 0, $s = strlen($bitmask); $i < $s; $i++) {
if ($bitmask{$i}) {
$days[] = pow(2, $i);
}
}
Jika saya perlu mengambil semua baris dengan hari kerja yang sama dengan tanggal saat ini, saya dapat meneruskan hari kerja saat ini ke kondisi SQL sebelumnya sebagai berikut:
$weekday = (int) date('w'); // 0 for Sunday, to 6 for Saturday
$weekdayToMySQL = pow(2, $weekday); // 1 - 64
Kemudian:
... WHERE `weekdays` & {$weekdayToMySQL};