2017-05-23 133 views
0

我正在使用Codeigniter查詢生成器編寫高級搜索查詢,但它給出了錯誤的結果。我有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

什麼是你的CI版本? – sintakonte

+0

@sintakonte CI版本是3.1.3。 – BTree

+0

保留組中的'or_like'部分 – Rajesh

回答

1

試試這個

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