Activedataprovider Join

Hi

zunächst mal, ich bin kompletter Yii Neuling!

Was habe ich:

Eine Tabelle mit Servern(one) und eine zweite mit Patches(many).

Über den Code generator habe ich für beides eine Anzeige gebaut mit den ganzen Crud Funktionen. Klappt.

In die Patchanzeige habe ich über die Relations(viele) in den ActiveDataProvider den Namen der Machine(eine) hinzugefügt und im GridView angezeigt. Auch Sortieren und suchen klappt.

Jetzt würde ich gerne zu den Maschinen anzeigen, ob es einen Security Patch gibt. Und zwar den mit der höchsten ID. Als select ist das ja in sekunden geschrieben. Aber wie geht man hier bei Yii vor?

Ich tue mich im Moment etwas schwer in dem ganze Wust aus Spezial Tutorials mit Sonderfällen diesen eigentlich simplen Fall zu finden.

Geht das überhaupt über Active Record und die Beziehungen? Oder muss ich erst die Liste der Maschinen ziehen und dann von Hand den passenden Patch suchen? Dann habe ich aber keinen ActiveRecord mehr, wie übergebe ich das dann an die GridView?

Könnte bitte mal einer Wegweiser spielen…

In Patchlist


return array(

   'machine' => array(self::BELONGS_TO, 'Machine', 'machine_id'),

);

In Machine


return array(

   'patchlists' => array(self::HAS_MANY, 'Patchlist', 'machine_id'),

);

Eine (von div. Möglichkeiten) wäre die "patchlists" relation um eine order by klausel zu erweitern (id DESC)

Dann könntest du immer das erste Element [0] in deinem GridView ausgeben (um dies zu realiseren könnstest du die Ausgabefunktion in deinem Controller oder Model definieren oder gleich als anony. Funktion direkt in der GridView Definition)

Du könntest im Model Machine (oder Server?) ein neues Attribut erstellen, was ungefähr so aussehen könnte:




public function getLatestPatch(){


return Patchlist::model()->find(array(

   'condition'=>'server_id = (SELECT max(number) FROM patchlist WHERE server_id = '.$this->server_id.')'

));


}



Also die Abfrage geht sicher eleganter, aber es geht ja ums Prinzip. :)