作業中のWebサイトに検索機能を実装する方法に問題があります。
検索フォームには、ユーザーがレンタカーを借りたい開始日と終了日の2つのフィールドがあります。
データベースには2つのテーブルがあります。1つは車両用で、もう1つは利用可能な日付用です。
Table: cars
- car_id (int)
- name (varchar)
- description (varchar)
Table: cars_availability
- car_id (int)
- date (datetime)
- status (int) // 1: available 2: booked
cars_availabilityの各行は、関連する車がレンタルまたは予約できる日を表します。
問題:
ユーザーが2013年2月5日から2013年2月8日まで利用可能な車を検索した場合、ユーザー選択ですべての日に利用可能なすべての車を選択するためのクエリを実行したいと思います。
私の現在の未完成の解決策:
私はこのようなものを使って一日中繰り返すことができることを知っています
$begin = new \DateTime( date('Y-m-d', strtotime($data['rent_start'])));
$end = new \DateTime( date('Y-m-d', strtotime($data['rent_end'])));
$end = $end->modify( '+1 day' );
$interval = \DateInterval::createFromDateString('1 day');
$period = new \DatePeriod($begin, $interval, $end);
$available_cars = array();
foreach ( $period as $dayTime ){
// query the cars and joining the cars_availabilty table
$item = DB::select('cars.*')
->from('cars')
->join('cars_availability')->on('cars_availability.item_id', '=', 'cars.item_id')
->where('items_availability.date', '=', $dayTime->format("Y-m-d H:i:s"))
->and_where('items_availability.status', '=', 1)
->execute()->as_array();
if(count($item) > 0){
if(isset($available_cars[$item[0]['item_id']])){
$available_cars[$item[0]['item_id']][] = $item[0];
}else{
$available_cars[$item[0]['item_id']] = array();
$available_cars[$item[0]['item_id']][] = $item[0];
}
}
}
この後、私はすべての日を利用できるかもしれない車の配列を持っているでしょう、しかし私はそれを見つけるためにいくつかの追加の計算をする必要があるでしょう。
より良いクエリを使用して、この問題に対してより洗練された解決策があるかどうかを知りたいです。
これについてフィードバックをいただければ幸いです。
ありがとう