2017-02-20 3 views
1

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

enter image description here

В принципе, вторая строка не должна быть вставлена ​​в базе данных, так как пользователь «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'); 
     } 
    } 
} 
+0

Pls содержит некоторые данные примера, предоставляет SQL-запрос, который генерирует CI из кода, данные, возвращаемые запросом, и данные, которые вы хотели бы вернуть, на основе ваших данных образца. – Shadow

+0

Я добавил объяснение выше с таблицей базы данных. Спасибо – coderszx

ответ

0

Вы можете рассчитать все это в 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

Не пробовал это еще, но будет ли timediff работать, так как мои резервные и резервные значения являются целыми? – coderszx

Смежные вопросы