2010-11-30 1 views
2

Поездки hasMany НогаFind() один из каждого поля соответствия CakePHP

Аэропорты не имеет никаких ассоциаций

Как я могу найти самые дешевые поездки для каждого аэропорта назначения с помощью CakePHP?

Прямо сейчас, единственное, что я могу придумать, - это пройти через множество аэропортов. Это потребует сотни запросов к базе данных (что, я думаю, не самый быстрый способ сделать это).

function getCheapestTrip($origin){ 

$airports=$this->Airport->getAirports(); 
foreach($airports as $airport): 
$cheapest_flights=$this->Trip->find('first', 
array(
'conditions'=>array('Leg.origin'=>$origin, 'MIN(Trip.price) as price'), 
'fields'=>array('Trip.origin','price','Leg.destination','Leg.depart','Leg.arrive'), 
'recursive'=>2, 
)); 
endforeach; 
} 
} 

Кроме того, я думаю, что этот тип вещи данные должны быть в модели на конвенции CakePHP (модели жира, тощий контроллеров). Я прочитал, что для вызова функции другой модели, такой как getAirports, я могу использовать loadModel, но я нашел это в разделе метода контроллера CakePHP. Как получить данные/модельную функцию другой модели в чужих?

Спасибо!

+0

В коде, который вы указали, вы перебираете через аэропорты, но не используете аэропорт в любом месте. Вы повторяете один и тот же запрос снова и снова. Вам не хватает условия? – RabidFire 2010-12-01 02:38:51

+0

Да, код, который я опубликовал, определенно является отправной точкой, и раньше я был измотан, когда отправил его. Я собираюсь попытаться снова понять эту штуку и, возможно, опубликовать/изменить что-то еще, если я не смогу ее получить. Благодарим за комментирование. – JohnAllen 2010-12-01 02:49:52

ответ

0

Ответ на ваш второй вопрос: «Как загрузить модель в другой модели?» можно найти here.

0

Если вы ищете лучший алгоритм, теперь у меня нет решения.

Mine - это дизайнерское решение: в основном вы должны добавить поле в аэропорт назначения, который будет обновляться каждый раз, когда вы добавляете новый полет, чтобы у вас была ваша информация прямо в записи вашего назначения.

Это стоит, если я понял вашу проблему. Я не английский, так что я не знаком с семантикой «нога», связанной с поездкой (для меня это часть тела)

0

Проблемы вы решение является коммивояжер Задача: http://en.wikipedia.org/wiki/Travelling_salesman_problem

Из того, что я читал о том, как это делают карты Google, вам нужно предварительно обдумать свои наиболее распространенные маршруты и соединения. Храните эту предварительно вычисленную информацию в дешевом кеше (memcache). В принципе, вы не сможете пересчитывать каждый раз, поэтому выведите несколько общих и создайте предварительно вычисленный кеш.

WRT алгоритм, некоторые поисковые запросы будут вашим другом для советов и трюков. Эта проблема была решена много раз (ни одна из них не является точно вычислительной эффективностью, поэтому вы должны прекомпретировать и кешировать).

Смежные вопросы