2017-05-23 29 views
0

Codeigniter Query Builderを使用して高度な検索クエリを作成していますが、その結果が間違っています。私は3つのデータベーステーブル(vehicles, vehicle_pictures, date_ranges)を取得しています。 date_rangesテーブルには各車両の使用不可能な日付が含まれており、車両ごとに使用不可能な日付範囲がゼロまたはそれ以上ある可能性があります。このアプローチが良いかどうかを知りたいですか?私の質問に間違いがあります。以下は私のフィルターの画像とコードです。 Picture of FiltersPHP Codeigniter詳細検索フィルタ

public function get_results() { 
    $location = strip_tags($this->input->get('location')); 
    $location = explode(',', $location ? $location : ''); 
    $pickup = $this->input->get('pickup'); 
    $dropoff = $this->input->get('dropoff'); 
    $min_price = $this->input->get('min_price'); 
    $max_price = $this->input->get('max_price'); 
    $types = $this->input->get('types') ? $this->input->get('types') : []; 
    $travelers = $this->input->get('people'); 
    $min_year = $this->input->get('min_year'); 
    $max_year = $this->input->get('max_year'); 
    $min_length = $this->input->get('min_length'); 
    $max_length = $this->input->get('max_length'); 

    $select = ['vehicles.id', 'vehicles.year', 'vehicles.model', 'vehicles.nightly_rate', 'vehicles.class', 'vehicle_pictures.picture', 'vehicles.people']; 
    $this->db->select($select); 

    if (!empty($location)) { 
     foreach ($location as $loc) { 
      $this->db->or_like('country', $loc, 'both') 
      ->or_like('state', $loc, 'both') 
      ->or_like('city', $loc, 'both') 
      ->or_like('street', $loc, 'both') 
      ->or_like('zip', $loc, 'both'); 
     } 
    } 

    if (!empty($pickup) && !empty($dropoff)) { 
     $d1 = date('Y-m-d', strtotime($pickup)); 
     $d2 = date('Y-m-d', strtotime($dropoff)); 

     $this->db->where("'$d1' NOT BETWEEN date_ranges.start_date AND date_ranges.end_date AND '$d2' NOT BETWEEN date_ranges.start_date AND date_ranges.end_date OR ('$d1' < date_ranges.start_date AND '$d2' > date_ranges.end_date) "); 

    } else { 
     if ($pickup && !$dropoff) { 
      $d1 = date('Y-m-d', strtotime($pickup)); 
      $this->db->where("'$d1' NOT BETWEEN date_ranges.start_date AND date_ranges.end_date "); 
     } 
     if ($dropoff && !$pickup) { 
      $d2 = date('Y-m-d', strtotime($dropoff)); 
      $this->db->where("'$d2' NOT BETWEEN date_ranges.start_date AND date_ranges.end_date "); 
     } 
    } 

    if (!empty($min_price) && !empty($max_price)) { 
     $this->db->where("vehicles.nightly_rate BETWEEN '$min_price' AND '$max_price' "); 
    } else { 
     if (!empty($min_price)) { 
      $this->db->where('vehicles.nightly_rate <=', $min_price); 
     } 
     if (!empty($max_price)) { 
      $this->db->where('vehicles.nightly_rate >=', $max_price); 
     } 
    } 

    if (!empty($min_year) && !empty($max_year)) { 
     $this->db->where("vehicles.year BETWEEN '$min_year' AND '$max_year' "); 
    } else { 
     if (!empty($min_year)) { 
      $this->db->where('vehicles.year <=', $min_year); 
     } 
     if (!empty($max_year)) { 
      $this->db->where('vehicles.year >=', $max_year); 
     } 
    } 

    if (!empty($min_length) && !empty($max_length)) { 
     $this->db->where("vehicles.length BETWEEN '$min_length' AND '$max_length' "); 
    } else { 
     if (!empty($min_length)) { 
      $this->db->where('vehicles.length <=', $min_length); 
     } 
     if (!empty($max_length)) { 
      $this->db->where('vehicles.length >=', $max_length); 
     } 
    } 

    if (!empty($travelers)) { 
     $this->db->where('vehicles.people >', $travelers); 
    } 

    if(!empty($types)) { 
     $this->db->where_in('vehicles.class', array_values($types)); 
    } 

    $query = $this->db->join('vehicle_pictures', 'vehicles.id = vehicle_pictures.vehicle_id', 'left') 
    ->join('date_ranges', 'vehicles.id = date_ranges.vehicle_id', 'left') 
    ->group_by('vehicles.id') 
    ->get('vehicles'); 
    echo '<pre>'; 
    print_r($query->result_array()); 
    exit; 
} 
+0

をお試しください – sintakonte

+0

@sintakonte CIバージョンは3.1.3です。 – BTree

+0

'or_like'部分をグループ内に保持してください – Rajesh

答えて

1

あなたのCIのバージョンは何ですか?この

if (!empty($location)) { 
      $this->db->group_start(); 
     foreach ($location as $loc) { 
      $this->db->or_like('country', $loc, 'both') 
      ->or_like('state', $loc, 'both') 
      ->or_like('city', $loc, 'both') 
      ->or_like('street', $loc, 'both') 
      ->or_like('zip', $loc, 'both'); 
     } 
      $this->db->group_end(); 
    } 
+0

ありがとうございました@Rajeshそれは今働いている、あなたは私の日を救った。 :-) – BTree

+0

喜んで助けました:) – Rajesh

+0

Rajesh今私は別の問題を抱えています。車に使用できない日付範囲が2つ以上ある場合、日付チェックは動作しません。 – BTree

関連する問題