Has_Many Nur Zeilen Anzeigen, Die Verknüpfte Ds Enthalten

Hallo,

ich habe eine Tabelle Komponisten, die über HAS_MANY mit der Tabelle Noten verknüpft ist:


public function relations() {

   return array(

      'Werke'=>array(self::HAS_MANY, 'Noten', 'Komponist_Id'),

   );

}

Ich möchte die search function im Model so ändern, dass in CGridView nur jene Zeilen angezeigt werden, bei denen tatsächlich verknüpfte Datensätze existieren.


public function search() {

   $criteria=new CDbCriteria;

   $criteria->with = array('Werke');

   ...

Wie kann ich überprüfen, ob es zu einem Komponisten Werke gibt?

Bitte um Nachsicht für die Anfängerfrage.

Durch die folgende condition sollten nur noch die Komponisten gelistet werden, zu denen es mindestens ein Werk gibt:


$criteria->condition = ('Werke.Komponist_Id IS NOT NULL')

Warum eigentlich eine Klammer?

Es funktioniert leider nicht.

Da bekomme ich die Meldung, dass die Spalte nicht existiert.


Unknown column 'Werke.Komponist_Id' in 'where clause'

In der Tabelle Noten gibt es aber diesen Fremdschlüssel :angry:

Wo kann da der Fehler liegen?

Die Klammer ist in der Tat überflüssig.

Wegen HAS_MANY ist noch folgendes notwendig:


$criteria->together = true;

=> http://www.yiiframework.com/wiki/?tag=together

Die Lösung ist folgende zusätzliche Zeile in der search() function:


$criteria->together = true;

Hier noch einmal die relevanten Codezeilen:


public function search() {

   $criteria=new CDbCriteria;

   ...

   $criteria->with = array('Werke');

   $criteria->condition = ('Werke.Komponist_Id IS NOT NULL');

   $criteria->together = true;



Gerade hatte ich das selber herausgefunden und gepostet. Ein lustiger Zufall :rolleyes:

Danke jedenfalls für die Hilfe.

Habe jetzt bemerkt, dass sich da noch ein anderer Fehler ergibt:

Es werden jetzt zwar nur jene Komponisten angezeigt, bei denen ein Werk existiert. Jedoch funktioniert die Pagination nicht korrekt.

Anscheinend werden bei der Pagination noch die anderen Komponisten (also jene ohne Werk) mitgezählt, obwohl sie nicht angezeigt werden.

Wie kann man das lösen?

Hier der Codeausschnitt aus der search() function im Model [b]Komponisten.php:

[/b]


$criteria->with = array('Werke');

$criteria->condition = ('Werke.Komponist_Id IS NOT NULL');

$criteria->together = true;

return new CActiveDataProvider($this, array(

	'criteria'=>$criteria,

        'pagination'=>array('pageSize'=> Yii::app()->user->getState('pageSize')),

        'sort'=>array('defaultOrder'=>'Zuname ASC'),

Das ist die Lösung:


  $criteria->group = 't.Id';

Hier noch einmal der Code-Block aus der search() function des Models:




$criteria->with = array('Werke');

$criteria->condition = 'Werke.Id IS NOT NULL';

$criteria->group = 't.Id';

$criteria->together = true;



Nun brauche ich aber auch eine Abfrage, die mir im GridView nur jene Zeilen anzeigt, die mehr als einen verknüpften Datensatz enthalten. Leider schaffe ich das trotz stundenlangem Probieren und Recherchieren nicht.


	

public function search() {

   $criteria=new CDbCriteria;

   $criteria->with = array('Verlag','Werke');

   $criteria->group = 't.Id';

   $criteria->together = true;

   $criteria->condition = 'count(Werke.Id) > 0';



Wie kann man die COUNT() Funktion in die Bedingung einbauen? Mein obiger Versuch funktioniert nicht.

Danke für jeden Tipp.