2010-11-30 7 views
2

Trips hasMany LegsFind() eine von jedem passenden Feld CakePHP

Flughäfen hat keine Assoziationen

Wie kann ich die günstigste Reise für jeden Zielflughafen mit CakePHP finden?

Im Moment ist das einzige, was ich mir vorstellen kann, durch eine Reihe von Flughäfen zu foreach. Dies würde Hunderte von Anfragen an die Datenbank erfordern (was meiner Meinung nach nicht der schnellste Weg ist, dies zu tun).

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; 
} 
} 

Außerdem glaube ich, dass dieser Datentyp Material im Modell pro CakePHP Konventionen (Fat Modelle, Skinny-Controller) sein sollte. Ich lese, dass, um eine andere Modellfunktion wie getAirports aufzurufen, kann ich loadModel verwenden, aber ich fand, dass in CakePHP Controller-Abschnitt. Wie sollte man die Daten/Modell-Funktion eines anderen Modells in andere integrieren?

Danke!

+0

In dem Code, den Sie zur Verfügung gestellt haben, durchlaufen Sie $ airports, verwenden aber nirgends $ airport. Sie führen dieselbe Abfrage immer wieder aus. Vermissen Sie eine Bedingung? – RabidFire

+0

Ja, der Code, den ich gepostet habe, ist definitiv nur ein Ausgangspunkt und früher war ich erschöpft, als ich ihn gepostet habe. Ich werde versuchen, das Ding wieder herauszufinden und vielleicht etwas anderes zu bearbeiten/bearbeiten, wenn ich es nicht verstehe. Danke fürs Kommentieren. – JohnAllen

Antwort

0

Die Antwort auf Ihre zweite Frage: "Wie lade ich ein Modell in ein anderes Modell?" kann here gefunden werden.

0

Wenn Sie nach einem besseren Algorithmus jetzt suchen, habe ich keine Lösung.

Mine ist eine Designlösung: Im Grunde sollten Sie Ihrem Zielflughafen ein Feld hinzufügen, das jedes Mal aktualisiert wird, wenn Sie einen neuen Flug hinzufügen, damit Sie Ihre Informationen direkt in Ihrem Zieldatensatz haben.

Das steht, wenn ich Ihr Problem verstanden habe. Ich bin nicht Englisch so bin ich nicht mit der Semantik „Bein“ verbunden zu einer Reise (für mich ist es ein Körperteil)

0

Das Problem, das Sie lösen, ist das Reisen Salesman Problem vertraut: http://en.wikipedia.org/wiki/Travelling_salesman_problem

Von dem, was ich gelesen habe, wie Google Maps es tut, werden Sie Ihre häufigsten Routen und Verbindungen vorausberechnen wollen. Behalte diese vorberechneten Informationen in einem günstigen Cache (memcache prolly). Grundsätzlich können Sie nicht jedes Mal neu berechnen, also berechnen Sie ein paar gewöhnliche und erstellen Sie einen vorberechneten Cache.

WRT der Algorithmus, einige Google-Suche wird dein Freund für Tipps und Tricks sein. Dieses Problem wurde viele Male gelöst (keine sind genau recheneffizient, weshalb Sie vorberechnen und cachen sollten).

+0

Ich versuche eigentlich nur, einzigartige Ziele zu finden. Wie finden Sie den billigsten Flug zu jedem möglichen Ziel von diesem Ursprungsflughafen. Ich habe das Problem schlecht erklärt; teilweise weil es schwierig für mich war. – JohnAllen

Verwandte Themen