2010-11-23 13 views
0

Tl; Dr: So erstellen Sie ein Array; von zwei Tabellen; mit hasMany und belongsTo Assoziationen; durchforschen; mit CakePHP; optimal.Verbindungstabellen CakePHP gehört zu, hat viele

EDIT: Von (http://book.cakephp.org/view/872/Joining-tables) Dies ist, was ich versuche zu lernen, obwohl es sagt "hasOne" und nicht hasMany ... .

"In CakePHP führt einige Zuordnungen (" belongsTo "und" hasOne ") automatische Joins zum Abrufen von Daten durch, so dass Sie Abfragen zum Abrufen von Modellen basierend auf Daten im verwandten ausgeben können.

Ich versuche, durch ein Array, das idealerweise Daten aus zwei Tabellen, die eine hasMany-Beziehung und eine andesTo-Beziehung haben, enthalten. Ich weiß, dass CakePHP hat Funktionalität eingebaut, um diese sehr einfach und möchte es benutzen:

  1. Reisen hasMany Beine
  2. Beine belongsTo stellt

Also, ich möchte ein Array machen enthält Daten von beiden Tabellen, damit ich die Daten in der Ansicht leicht anzeigen kann. Beachten Sie, dass Sie nichts mit dem Array zu tun haben, das Suchparameter enthält. Ich denke, CakePHP verbindet Tabellen, wenn ich Assoziationen erstelle; Ich bin mir nicht sicher, wie ich beim Erstellen eines Arrays auf diese Verknüpfungen zugreifen soll.

(Ich habe schon Stunden damit verbracht und konnte kein Beispiel finden, wie man es im Web oder in Büchern macht, also vielen Dank für Ihre Hilfe). Ich könnte mich damit herumärgern (indem ich ein separates Array erstelle und eine viel kompliziertere View-Datei habe), aber ich fange gerade an zu programmieren und würde es gerne etwas optimaler machen und die CakePHP-Funktionalität nutzen.

Vielen Dank im Voraus für Ihre Hilfe! Habe ich nicht recht, dass ich bei diesen Zuordnungen ("anglesTo" und "hasMany") die Joins im controller/find() nicht explizit deklarieren muss? Ich könnte jetzt versuchen, manuell die Joins zu machen, um zu sehen, was passiert.

Code Bestehende (das funktioniert gut):

trips_controllers:

function view() { 
    if(empty($this->data)){ 
     $this->Session->setFlash('You forgot to put stuff in the form fields!'); 
     $this->redirect(array('action'=>'index')); 
    } 
    $price=$this->data['Trip']['price']; 
    $origin=$this->data['Trip']['origin_airport']; 
    $this->set('trips', $this->Trip->find('all', array('conditions'=>array('Trip.price <='=>$price, 'Trip.origin_airport'=>$origin), 'limit'=>30, 'recursive=>2'))); 

Ansicht:

<th>Trip ID</th> 
      <th>Price</th> 
      <th>Origin</th 
      </tr> 
      <? foreach($trips as $trip):?> 
      <tr> 
       <td><?=$trip['Trip']['trip_id'];?></td> 
       <td><?=$html->link($trip['Trip']['url']);  ?> 
       <td><?=$trip['Trip']['origin_airport'];?></td> 
       <td><?=$trip['Trip']['price'];?></td>    
       </tr> 
       <? endforeach;?> 

Nochmals vielen Dank!

+0

Könnten Sie klären, was mit dem aktuellen '$ trips'-Array, das Sie von einem Standard-' find'-Aufruf bekommen, nicht stimmt und warum Sie es nicht wie gewünscht durchschleifen können? – deceze

+0

Danke Dezeze. Dein Kommentar lässt mich denken, dass sie jetzt zugänglich sein sollten. Wenn die Daten der zweiten Tabelle da sind, wie würde ich dann in der foreach auf sie zugreifen? Ich werde $ trip ['2ndtablename'] ['fieldname'] versuchen, während ich auf deine Antwort warte. – JohnAllen

Antwort

1

Wenn Trip hasMany Beine, sollten Sie wie so eine Schleife durch die Daten in der Lage sein:

foreach ($trips as $trip) { 
    echo $trip['Trip']['id']; 
    … 
    foreach ($trip['Leg'] as $leg) { 
     echo $leg['id']; 
     … 
    } 
} 

debug($trips) dein Freund. Das standardmäßige Cake-Daten-Array-Layout ist sehr sinnvoll. Versuchen Sie sich daran zu gewöhnen, es sollte nur sehr wenig notwendig sein, die Struktur in 99,99% der Anwendungen zu modifizieren. Im Gegenteil, es gibt starke Argumente dafür, diese überall konsistent zu halten.

+0

So Debug ($ trips) zeigt definitiv Reisen und Beine, zeigt aber keine Segmente. Beine hat viele Segmente.Ich dachte, dass Segmente auch mit recursive = 2 auftauchen würden (aber ich werde jetzt 3 versuchen). Wie könnte ich auch durch Segmente foreach? Wieder ist es: trips hat viele Beine hat viele Segmente. Danke noch einmal! – JohnAllen

+0

@John Sie sollten wahrscheinlich Ihren rekursiven Parameter un-typo, dann sollte es funktionieren: ''rekursiv' => 2'. :) – deceze

+0

Duh .... danke nochmal! – JohnAllen

Verwandte Themen