Codeigniter Group, вернув только первую строку

У меня есть модуль бронирования в codeigniter, в котором я ограничиваю пользователей бронировать клуб только на 2 часа в день. В настоящее время я создаю проверку в codeigniter, чтобы ограничить их резервирование. Я выбрал все резервирования и сгруппировал их по строкам, имеющим одинаковую дату, чтобы правильно их ограничить. Проблема в том, что созданная мной модель возвращает только 1 строку, а не все результаты. Это означает, что мой счетчик просто изменяется только одной строкой, и я ожидаю, что все строки должны влиять на счетчик.
Ниже моя таблица базы данных:

введите описание изображения здесь

По сути, вторая строка не должна быть вставлена ​​в базу данных, потому что пользователь ‘20130123’ уже использовал свое максимальное резервирование на день, который составляет два часа. Я предоставил проверку проверки ниже, чтобы проверить, не использовал ли пользователь два часа резервирования, и моя логика заключается в том, что я просто вычитаю конец резервирования с началом резервирования. Используя приведенную выше таблицу просто в качестве примера и для моего объяснения, моя проблема заключается в том, что в моей модели значение счетчика становится только «2», потому что он читает только первую строку (8–6 = 2), а не «3» ( результат первой строки, равный 2, затем добавьте результат второй строки, равный 1: [(8-6) + (9-8)])

Подводя итог, моя проблема заключается в значении счетчика, потому что он добавляется только к первой строке, которую читает запрос.

Вот мой код

Модель:

function check_twohours_clubhouse()
{
$query = $this->db->select('*')->from('clubhouse_reservation')->where('username', $this->session->userdata('username'))->group_by('reservation_date')->having('count(reservation_date) > 1')->get();
$result = $query->result();

if($query->num_rows() > 0)
{
$ctr = '0';
foreach($result as $row)
{
$totalhour = $row->reservation_end - $row->reservation_start; // subtract reservation start to reservation end to get the number of hours
$ctr = $ctr + $totalhour;
}

$ctr = $ctr + ($this->input->post('reserveend') - $this->input->post('reservestart')); // add the selected "add reservation" hours to the counter

if($ctr > 2) // counter > 2 hours limit
{
return FALSE;
}
else
{
return TRUE;
}
}
else
{
return TRUE;
}
}

контроллер:

function create_reservation_clubhouse()
{
$this->form_validation->set_error_delimiters('<div class="error">','</div>');
$this->form_validation->set_rules('datepick', 'Date', 'required|no_olddate');
$this->form_validation->set_rules('reservestart', 'Reservation Start', 'required|hourselection|unique_reserve_clubhouse|max_twohours');

if ($this->form_validation->run() == FALSE)
{
$this->template->load('user_template', 'view_userreservation_addclubhouse');
}
else
{
if($this->model_reservation_user->check_twohours_courtone())
{
if($query = $this->model_reservation_user->create_reservation_clubhouse())
{
$this->session->set_flashdata('reservefeedback', 'You have successfully reserved a date for the Clubhouse. Please wait for the administrators to accept your reservation.');
redirect('user_reservation/clubhouse');
}
}
else
{
$this->session->set_flashdata('reservefail', 'You cannot reserve more than two hours of Clubhouse per day.');
redirect('user_reservation/clubhouse');
}
}
}

1

Решение

Вы можете рассчитать все это в SQL, используя time_to_sec () а также TimeDiff () функции:

select reservation_date, sum(time_to_sec(timediff(reserveend, reservestart)) / 3600 as reserved_hours
from clubhouse_reservation
where username =...
group by reservation_date
having count(*)>1 --although it is not clear to me why you have this restriction

Вышеупомянутый запрос будет суммировать для данного пользователя на дату бронирования, часы, на которые зарезервировано здание клуба (3600 = количество секунд в час).

В вашем PHP-коде вам нужно только проверить, если reserved_hours в результате> 2 или нет.

Я не очень разбираюсь в CI, поэтому не могу точно сказать, как преобразовать вышеуказанный sql в CI. Но я боюсь, что вам придется использовать raw sql из-за того, как он суммирует время.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector