Временная доступность ресурсов для событий в MySQL / PHP - PullRequest
1 голос
/ 04 июня 2010

Для системы событий мне нужно проверить, достаточно ли ресурсов для события. События имеют начальную и конечную временные метки и нуждаются в ряде ресурсов (для простоты будем предполагать, что существует только 1 тип ресурса). Когда новое событие зарегистрировано, должна быть проверка, если это возможно. Все события являются основанными на доктринах php-объектами, временные метки не должны быть более конкретными, чем минуты.

У меня проблемы с примером, подобным следующему:

  • 1 ресурс необходим с 12:00 до 13:00
  • 1 ресурс необходим с 13:00 до 14:00
  • создается новое событие, для которого требуется 1 ресурс с 12:00 до 14:00

Давайте предположим, что у нас всего 2 ресурса, тогда это должно быть возможно. В настоящее время я выбираю все события, которые перекрываются с новым событием (т.е. с 12:00 до 14:00), и беру сумму всех ресурсов, необходимых для этих событий. Это будет означать, что новое событие невозможно.

Как я могу проверить (эффективно), возможно ли новое событие? Либо используя только запрос доктрины, либо сделав базовый выбор, используя запрос доктрины, а затем выполните фильтрацию с помощью php. Единственное решение, которое я до сих пор придумал: выбрать все события с 12:00 до 14:00 и проверять каждую минуту (например, 120 итераций), если ресурс перебронирован.

1 Ответ

0 голосов
/ 04 июня 2010

Поскольку вы работаете с метками времени, это может быть довольно просто.

Вы бы потянули все события за день. Затем выполните цикл по каждому из них, чтобы убедиться, что границы меток времени нового события конфликтуют с границами меток времени существующего события

$conflict = false;
foreach($arrEvents as $event) {
    if ($newStart >= $existingStart && $newStart < $existingEnd) {
        // The start time falls within this event's time
        $conflict = true;
    } elseif ($newEnd > $existingStart && $newEnd <= $existingEnd) {
        // The end time falls within this event's time
        $conflict = true;
    } elseif ($newStart <= $existingStart && $newEnd >= $existingEnd) {
        // Existing event falls completely within the new event
        $conflict = true;
    }
}

Очевидно, что цикл по всем событиям не самый эффективный из возможных способов, но это базовое решение, которое я использовал в прошлом, когда эффективность не была проблемой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...