2012-04-07 4 views
0

ich habe zwei Tabellen tbl_entries und tbl_votings

tbl_entries -> id, othercolums 
tbl_votings -> id, entry_id, othercolumns 

Ich möchte Daten in zii.widgets.CListView von den tbl_entries zeigen, wenn die Nutzer für die Einträge gestimmt.

Ich bin in der Lage, unter SQL-Abfrage erfolgreich auszuführen.

select * from tbl_entries where id in (select tbl_entries.id from tbl_votings where entry_id = tbl_entries.id) 

Wie kann ich im YII-Stil tun, so dass ich Ergebnisse in CListView anzeigen kann?

Antwort

1

in Entries Modell Beziehung hinzufügen:

... 
'votes' => array(self::HAS_MANY, 'Votings', 'entry_id'), 
... 

dann über AR suchen:

$records = Entries::model()->with('votes')->findAll(); 

Hoffnung, das hilft.

+0

i Ihre Lösung verwendet. $ dataProvider = Einträge :: model() -> with ('votes') -> findAll(); in CListView einfügen, aber es gibt Fehler "Schwerwiegender Fehler: Aufruf einer Memberfunktion getData() auf einem Nicht-Objekt in ..." –

0

Aktualisiert

Ok, habe ich verpasst Wort „wenn“ in Ihrem Beitrag, und haben Sie Einträge benötigen nur, wenn Benutzer für ihn gestimmt. Lesen Sie das Update unten für den richtigen Code. Ich überlasse Ihnen den ersten Teil für den Fall, dass Sie ihn in Zukunft brauchen. INNER JOIN nimmt NUR Einträge, wenn diese Einträge mindestens 1 Stimme haben.

------------------ ERSTER TEIL (falsch) --------------------

Deklarieren Sie eine Beziehung in Ihrem Entries Modell:

public function relations() { 
    return array(
     'votes' => array(self::HAS_MANY, 'Votings', 'entry_id'), 
    ); 

}

Und wenn Sie Ihre Daten-Provider es tun, wie folgt erstellen:

$dataProvider = new CActiveDataProvider('Entries', 
    array(
     'criteria' => array(
      'with' => array(
       'votes'=>array(
        'joinType' => 'INNER JOIN' 
       ) 
      ) 
     ) 
    ) 
); 

Dies wird nicht erstellen Sie die SQL, die Sie oben geschrieben haben, aber dies wird es richtig machen. Die SQL werden wie folgt aussehen:

select * from tbl_entries t INNER JOIN tbl_votings v ON t.id = v.entry_id 

----------------- zweiten Teil (rechts) ----------- -------

aktualisieren

Ok, wenn Sie also einfach Einträge und Stimmen brauchen, um für sie tun Sie das gleiche Verhältnis Erklärung ersten Teil:

public function relations() { 
    return array(
     'votes' => array(self::HAS_MANY, 'Votings', 'entry_id'), 
    ); 

}

und erstellen Sie Ihre Datenprovider wie folgt aus:

$dataProvider = new CActiveDataProvider('Entries', 
    array(
     'criteria' => array(
      'with' => array('votes') 
     ) 
    ) 
); 
Verwandte Themen