Hi Andreas,
> Ich möchte eine Suche bereitstellen die sich aber leider nicht nur auf
> ein Model bzw. eine Tabelle bezieht
> Als Beispiel: Ich habe 2 Models (+2 Controller +2 DB-Tabellen) "City"
> und "Street". Jetzt will ich auf einer Seite eine Such bereitstellen
> die in beiden Tabellen nach passenden Einträgen sucht. (eine Suche
> nach "Berlin", findet also sowohl die Stadt Berlin als auch Straßen
> die "Berlin" heißen.
>
> Also habe ich mir einen Controller SearchController gebastelt deren
> Index-Action in den beiden Tabellen suchen sollte - geht aber
> natürlich nicht da es kein Search-Model gibt...
>
> Wie löst man das? Ich möchte die Suche eigentlich nicht einem der
> beiden Controller Strasse/Stadt zuweisen weil es ja eigentlich zu
> beiden gehört und ich auch am liebsten in der URL statt citys/
> search/... eben /search/... stehen hätte.
Ob Du einen Search-Controller benötigst, weiß ich gar nicht mal so
genau. Da wäre ich auch noch auf Input anderer hier gespannt. Aus
technischer Sicht benötigst Du ihn nicht, aber eventuell sind die
einzelnen Funktionalitäten so besser getrennt.
Im Kopf des Controllers sagst Du ja immer
var $uses = array('ModelName');
Also z.B. im StreetController
var $uses = array('Street');
Somit kannst Du dann im Controller über $this->Street auf Dein Model
zugreifen.
Du kannst in dem Array aber auch noch beliebige andere Models mit
aufnehmen, also z.B. im StreetController
var $uses = array('Street', 'City');
Jetzt kannst Du über $this->City auch auf dieses Model zugreifen. Es
ist gerade die Aufgabe des Controllers, die Daten mehrerer Models zu
verarbeiten und an ein View zu geben.
Wenn Du aber - wie ich es in Deinem Fall annehme -, eine Relation
zwischen zwei Models geknüpft hast, musst Du aber im Controller das
zweite Model gar nicht mit angeben.
Beispiel:
CityModel:
var $hasMany = array('Street');
# Eine Stadt hat mehrere Straßen
StreetModel
var $belongsToMany = array('City');
# ein Straßenname kann in mehreren Städten vorkommen.
Jetzt reicht es z.B. im StreetController aus, nur das StreetModel zu
benutzen:
var $uses = array('Street');
Trotzdem kannst Du im StreetModel nicht nur mittels $this->Street auf
das StreetModel, sondern mittels $this->Street->City auch auf das
CityModel zugreifen. Das nennt man "Chaining" und ist ziemlich
nützlich, weil man so nur in den Models die Relationen definiert.
Bei mehr Relationen kann es hier aber Performance-Probleme geben. Lies
Dir deshalb am Besten auch noch
http://cakebakery.de/2007/02/16/fallstricke-bei-den-model-relationen/
durch. Da habe ich das mal etwas genauer erläutert und auch einen
Ausweg gezeigt. In Cake 1.2 wird das dort beschriebene expects() nicht
mehr benötigt, sondern wird durch etwas noch flexibleres ersetzt.
Jetzt aber zurück zu Deiner Ausgangsfrage. Wenn Du ein
SearchController erstellst, kannst Du dort einfach ein
var $uses = array('Street');
angeben, um auf das StreetModel und über Chaining auf das CityModel
zuzugreifen.
Du könntest die Suche rein technisch auch in einem der beiden Models
machen, aber da hast Du schon Recht, dass dann nie so klar ist, wo das
denn nun eigentlich hin soll. Die "/search/"-Route kannst Du in der
routes.php aber auch ohne einen SearchController anlegen.
Ich hoffe, das hat Dir erst einmal weiter geholfen.
Gruß,
Dirk
--~--~---------~--~----~------------~-------~--~----~
Sie erhalten diese Nachricht, weil Sie Mitglied sind von Google Groups-Gruppe
"CakePHP-de für deutsche CakePHP Entwickler".
Für das Erstellen von Beiträgen in dieser Gruppe senden Sie eine E-Mail
an [email protected]
Um sich von dieser Gruppe abzumelden, senden Sie eine E-Mail an [EMAIL
PROTECTED]
Weitere Optionen finden Sie in dieser Gruppe unter
http://groups.google.com/group/cakephp-de?hl=de
-~----------~----~----~----~------~----~------~--~---