Как правильно организовать поиск билетов туда/обратно?

Добрый день.
На сайте есть поиск билетов.
Поиск осуществляется по следующим полям:
1) Город вылета
2) Город прилёта
3) Дата вылета
4) Дата прилёта
5) Checkbox для выбора направления, в одну сторону или билет туда/обратно.
Сейчас поисковая модель содержит такие условия:
$query->andWhere(['status' => Flights::STATUS_ACTIVE])
              ->andWhere(['>=', 'date_start', $this->date_from ? strtotime($this->date_from . ' 00:00:00') : null])
              ->andWhere(['=', 'city_start_id', $this->city_from])
              ->andWhere(['=', 'city_end_id', $this->city_to]);

        $query->andFilterWhere(['<=', 'date_end', $this->date_to ? strtotime($this->date_to . ' 23:59:59') : null])
              ->andFilterWhere(['=', 'airline_id', $this->airline])
              ->andFilterWhere(['in', 'airport_start_id', $this->airport_id])
              ->andFilterWhere(['in', 'airline_id', $this->company_id])
              ->andFilterWhere(['=', 'agent', $this->partner]);

Выбор направления задаётся переменной
// если переменная равна 1, то билеты надо искать туда/обратно, если равна 2, то билеты искать в одну сторону.
public $direction = 1;

Если ищется билет в одну сторону, то особых проблем нет, вроде работает нормально.
А вот с поиском билетов туда/обратно сложность.
Как правильно указать условия поиска?
Или при внесении перелётов в базу данных делать связь между билетами туда/обратно?

P.S. Вообще-то не могу в голове сложить, по каким параметрам поиск обратного сделать.
Если билет "туда", то есть две даты, вылет/прилёт. Но если искать билет "обратно", то с датами непонятно как сделать. Обратно билет не стоит же искать в дату прилёта, нужен какой-то интервал...
Короче, запутался вконец...
  • Вопрос задан
  • 967 просмотров
Решения вопроса 1
padlyuck
@padlyuck
Обычно в сервисах делают фиксированную дату вылета. т.е. если пользователь ищет билет только "туда" то он вводит желаемую дату вылета и система ищет билет из точки А в точку Б с вылетом в указанную дату.
Если ищется билет "туда и обратно" то к результатам первого поиска добавляются результаты поиска по второй дате где отправные точки меняются местами. Если же нужно дату вылета и возврата задать промежутком, а не фиксированную то запрос будет примерно такой:
1. для поиска только "туда"
SELECT * FROM `flights` WHERE
    (`departure_time` BETWEEN 'user_departure_wants_min' AND 'user_departure_wants_max'
    AND `departure_airport` = user_departure_wants_from
    AND `arrive_airport` = user_arrive_wants_to);

2. для поиска "туда и обратно"
SELECT * FROM `flights` WHERE
    (`departure_time` BETWEEN 'user_departure_1_wants_min' AND 'user_departure_1_wants_max'
    AND `departure_airport` = user_departure_wants_from
    AND `arrive_airport` = user_arrive_wants_to)
    OR
    (`departure_time` BETWEEN 'user_departure_2_wants_min' AND 'user_departure_2_wants_max'
    AND `departure_airport` = user_arrive_wants_to
    AND `arrive_airport` = user_departure_wants_from)

Где user_departure_wants_min, user_departure_wants_max, user_departure_1_wants_min, user_departure_1_wants_max - минимальная и максимальная дата вылета "туда"
user_departure_2_wants_min, user_departure_2_wants_max минимальная и максимальная дата вылета "обратно"
user_departure_wants_from - аэропорт из которого пользователь хочет вылететь(и куда хочет вернуться в случае поиска "туда и обратно")
user_arrive_wants_to - аэропорт куда пользователь хочет прилететь(и откуда хочет улететь в случае поиска "туда и обратно")

Как-то так мне кажется оно должно быть. Этот вариант учитывает только поиск прямых перелетов. Поиск с пересадками естественно будет намного сложнее.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы