Найти () по одному из каждого соответствующего поля CakePHP - PullRequest
2 голосов
/ 01 декабря 2010

поездок имеет много ног

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

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

Спасибо!

Ответы [ 3 ]

0 голосов
/ 01 декабря 2010

Проблема, которую вы решаете, это проблема коммивояжера: http://en.wikipedia.org/wiki/Travelling_salesman_problem

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

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

0 голосов
/ 01 декабря 2010

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

0 голосов
/ 01 декабря 2010

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

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

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

...