2009-07-29 18 views
0

Ich habe zwei Tabellen über ein HABTM verbunden. Länder & Netzwerke. Sie sind durch die Nachschlagetabelle countries_networks miteinander verknüpft.CakePHP-Array-Struktur aus einer HABTM-Abfrage

Ich brauche alle Länder und alle zugehörigen Netzwerk-IDs für jedes entsprechende Land. Ich muss nicht so weit gehen, um die Netzwerknamen zu bekommen, es genügt, nur die IDs aus der Nachschlagetabelle zu bekommen.

Wenn ich einen Fund (alle) mache, gibt es mir eine Reihe von Ländern, aber nicht in der Struktur, die ich brauche. Ich brauche etwas, Link zurück, aber ich brauche nur Country.countryName und CountriesNetwork.network_id:

Array 
(
    [0] => Array 
     (
      [Country] => Array 
       (
        [countryName] => Aeroplane 
       ) 
      [Network] => Array 
       (
        [0] => Array 
         (
          [id] => 1 
          [CountriesNetwork] => Array 
           (
            [id] => 1 
            [country_id] => 1 
            [network_id] => 1 
           ) 
         ) 

        [1] => Array 
         (
          [id] => 7 
          [CountriesNetwork] => Array 
           (
            [id] => 2 
            [country_id] => 1 
            [network_id] => 7 
           ) 
         ) 
       ) 
     ) 
) 

Gibt es eine Möglichkeit, dies mit einem findall tun()? Als ob ich Felder als Array übergebe, bekomme ich immer einen unbekannten Spaltennamen SQL Fehler. Oder sogar eine benutzerdefinierte Abfrage? Vielen Dank im Voraus an alle, die Ihnen helfen können.

Antwort

1

Pickledegg,

Klingt wie Sie das Contain Verhalten untersuchen sollte. Es ermöglicht Ihnen, Bedingungen für die verbundenen Modelle wie gewünscht anzugeben, und die Daten werden auf die gleiche Weise wie beim normalen Aufruf find() formatiert.

Weitere Informationen finden Sie im Handbuch.

+0

containable hat den Trick gemacht, das kombiniert mit dem set :: extract :) –

1

Da Sie kein Modell für network_countries haben, ist es nicht möglich, diese Werte mit find oder findAll zu erhalten. Ich denke, die einfachste Lösung besteht darin, eine benutzerdefinierte Abfrage auszuführen, um die benötigten Daten abzurufen.

$query = "SELECT country_id, network_id 
FROM countries C LEFT JOIN network_countries NC ON (NC.country_id = C.id)" 
$this->Country->query($query); 

Leider ergab das Ergebnis, dass Code find Ergebnisse dann etwas anders formatiert.

Oder Sie könnten ein Modell für Netzwerkländer hinzufügen, aber ich denke nicht, dass dies eine gute Idee ist.

+0

Dank RaYell, ich habe versucht, wie es passiert, aber es gibt mir doppelte Länder dann möchte ich das Format zu 'CountryName', mit einem Array von Netzwerk-IDs oder Namen. –

+0

Ja, es dupliziert die Länder, denn so funktioniert LEFT JOIN, aber ich weiß nicht, ob Sie es einfacher machen können. Ich nehme an, du könntest Länder bekommen und dann für jedes Land eine Abfrage ausführen, um Netzwerk-IDs zu erhalten, aber das erfordert, dass viele Abfragen anstelle von einem laufen. Sie können die Ergebnisse immer nach country_id sortieren und über das Ergebnis iterieren und prüfen, ob country_id der aktuellen Zeile sich geändert hat. Ich kann mir nichts einfacheres vorstellen, als dass ich Angst habe – RaYell

+0

vielen Dank :) –