Выбор одновременных телефонных звонков из БД

У меня есть база данных с записями телефонных звонков, и каждый месяц я бы выставлял счета клиентам на ее основе.

Запись содержит:

 ID - Owner - Caller_ID  - Calling_To - connect_time - disconnect_time - category

Клиент может иметь несколько номеров. Если в какой-то момент 2 записи перекрывали connect_time, это параллельный вызов. Например:

X1 - Alex - 0099989898 -  random number - 01:00:00 - 02:00:00 - international
X2 - Alex - 0055989898 -  random number - 01:30:00 - 01:50:00 - local
X3 - Alex - 0066666666 -  random number - 01:45:00 - 02:00:00 - local

X1 и X2 являются параллельными вызовами.

Мой текущий запрос, который я использую для получения записей за последний месяц, выглядит следующим образом:

CallDataRecord::where('owner', 'Alex')
                ->whereBetween('connect_time', array($beginDate, $endDate))
                ->orderBy('connect_time', 'desc')
                ->get();

Это довольно просто, но у меня не было никакого успеха в том, где начать запрашивать параллельные вызовы.

Я сделал сценарий PHP, используя массивы и кучу if elseоператоров плюс функцию, напримерisDateBetween, что я бы запустить все извлеченные записи из базы данных в foreachцикле, который будет проверять, если число/запись инкапсулируется? по другому номеру / записи, таким образом, получая параллельный вызов. Это очень медленно.

Я был бы признателен за руководство. Спасибо!.

1 ответ

  1. Да, цикл над возвращаемым результатом в PHP будет очень медленным, так как данные не будут индексироваться, в отличие от системы баз данных.

    Ниже следует вернуть данные, которые вы ищете :

    CallDataRecord::where('owner', 'Alex')
        ->whereBetween('connect_time', array($beginDate, $endDate))
        ->where(function ($q) {
            $q->where('connect_time', '>=', 'connect_time')
            $q->where('connect_time', '<=', 'disconnect_time')
        })
        ->orWhere(function ($q) {
            $q->where('disconnect_time', '>=', 'connect_time')
            $q->where('disconnect_time', '<=', 'disconnect_time')
        })
        ->orderBy('connect_time', 'desc')
        ->get();