Мне нужно отфильтровать конкретные события на основе определенных критериев, например,
который дает следующий массив в php:
array(
0 => [[12, 00]],
1 => [[15, 30]],
4 => [[17, 15], [18, 00]]
)
Окончательный массив может быть скорректирован в соответствии с потребностями, однако теперь я хочу выбрать из schedule_event
стол, который имеет starts_at
свойство, которое хранит дату и время
Вопрос в том, можно ли выбрать конкретные события, например, Понедельник вернет тех, кто начинается в 12:00 (вторник не должен), пятница вернется в 17:15 и 18:00.
До сих пор у меня было это:
... WEEKDAY(se.startsAt) IN (:weekDays) ...
А также :weekDays
было просто array_keys
данного массива.
Теперь я не знаю, как на самом деле включить время сейчас.
Вы должны создать пары условий будний день — час [- минута] для достижения ожидаемого результата:
select ...
from ...
where WEEKDAY(se.startsAt)=0 and hour(se.startsAt)=12
or WEEKDAY(se.startsAt)=1 and hour(se.startsAt)=15 and minute(se.startsAt)=30
...
Вместо использования часов и минут, вы также можете использовать один date_format()
позвони, но я оставлю это тебе.
Вы больше не можете использовать WEEKDAY IN (list of days)
потому что одного дня недели недостаточно, чтобы дать истину. Вам нужен список ИЛИ, и каждое ИЛИ состоит из условия дня недели И с часовыми условиями для этого дня, которые являются списком, и эти последние будут объединены ИЛИ.
Таким образом, вы собираете массив в SQL-запрос, где вам нужно построить как SQL, так и значения:
array(
0 => [[12, 00]],
1 => [[15, 30]],
4 => [[17, 15], [18, 00]]
)$sets = [ ]; // SQL conditions for each day
$values = [ ]; // List of accumulated values to send to execution
foreach ($conditions as $dayNum => $listTimes) {
$hours = [ ];
$values[] = (int)$dayNum;
// Each time is an array of (hour, minute)
// which comes handy for building the query
foreach ($listTimes as $pair) {
$hours[] = '(HOUR(se.startsAt) = ? AND MINUTE(se.startsAt) = ?)';
$values[] = (int)$pair[0];
$values[] = (int)$pair[1];
}
$sets[] = "(WEEKDAY(se.startsAt)=? AND (" . implode(' OR ', $hours) . "))";
}
$filter = implode(' OR ', $sets);
Это станет чем-то вроде (пропуская аргументы для ясности)
(WEEKDAY=0 AND ((HOUR=12 AND MINUTE=0)))
OR
(WEEKDAY=1 AND ((HOUR=12 AND MINUTE=0) OR (HOUR=14 AND MINUTE=30)))
...
Так:
// PREPARE this
$sql = "SELECT ... WHERE {$assembledConditions}";
// And EXECUTE passing $values.
Любые дополнительные значения в запросе должны быть помещены в $values
заранее, конечно.