Codeigniter, дублирующие результаты после вложенного Foreach - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть 2 модели в моем Codeigniter, 1 получает все номера, а вторая модель получает забронированные номера в диапазоне выбранной даты.

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

Мои модели:

public function rooms(){
    $result = $this->db->select('*')
    ->from('rooms')
    ->group_by('room_id')
    ->get()
    ->result();

    return $result;
}


public function check_room_availability($start, $end){
    $this->db->select('*');
    $this->db->from('room_actions as ra', 'rooms as r');
    $this->db->join('rooms as r', 'r.room_id = re.room_id', 'LEFT'); 
    $this->db->where('ra.days >=', $start);
    $this->db->where('ra.days <=', $end); 
    $this->db->group_by('ra.room_id'); 

    $query = $this->db->get()->result();

    return $query;
    }

И мой взгляд:

<?php foreach($all_rooms as $room) { 
    foreach($booked_ones as $booked) {?>
  <div class="<?php
      if($booked->room_id == $room->room_id){
        echo 'room_box red';}
        else{
          echo 'room_box green';}?>">

      <?php echo $room->room_id; ?>
  </div>
<?php } ?>
 <?php } ?>

Я бы оценил, если бы вы могли мне помочь. Спасибо.

Как вы можете видеть на изображении ниже, если у меня забронированы 2 комнаты на выбранные даты, мои комнаты дублируются. Если я забронировал 3 номера, он становится X 3.

https://pasteboard.co/I8AkG8i.jpg

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

Попробуйте, надеюсь, это вам поможет.

Если rooms таблица имеет уникальный room_id, тогда не нужно использовать group_by()

public function rooms(){
$result = $this->db->select('*')
->from('rooms')
->get()
->result();

return $result;
}

Здесь нетнужно join()

public function check_room_availability($start, $end){

$booked_rooms = array(); 

$this->db->select('room_id');
$this->db->from('room_actions as ra');
$this->db->where('ra.days >=', $start);
$this->db->where('ra.days <=', $end); 
$query = $this->db->get()->result();
if(isset($query) && count($query) > 0){
   foreach($query as $row){
    if(!in_array($row->room_id, $booked_rooms)){
       array_push($booked_rooms, $row->room_id);
    }
   }
} 
return $booked_rooms;
}

Теперь у вас есть простой массив забронированных номеров.В представлении сделать это только с одной forach() петлей

foreach($all_rooms as $room) {
   if(in_array($room->id, $booked_rooms)){
       //Room is booked
   }
}
0 голосов
/ 04 апреля 2019

Попробуйте это,

public function check_room_availability($start, $end) {
        $this->db->select('r.room_id as room_id,ra.room_id as booked_room_id');
        $this->db->from('rooms as r');
        $this->db->join('room_actions as ra', 'r.room_id = ra.room_id', 'LEFT');
        $this->db->where('ra.days >=', $start);
        $this->db->where('ra.days <=', $end);
        $query = $this->db->get();
        if ($query->num_rows() > 0) {
            return $query->result();
        } else {
            return array();
        }
    }

OR

public function check_room_availability($start, $end) {
        $this->db->select('*,(select room_id from room_actions as ra where ra.room_id = r.room_id and ra.days >=' . $start . ' and ra.days <=' . $end . ') as booked_room_id');
        $this->db->from('rooms as r');
        $query = $this->db->get();
        if ($query->num_rows() > 0) {
            return $query->result();
        } else {
            return array();
        }
}

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

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