Korrekte Anwendung von Relations

Hallo!

Ich habe mir die Seite Relations in der Yii-Doku durchgelesen, verstehe aber noch nicht genau, wie das Ganze funktioniert.

Nehmen wir an, ich habe 3 Tabelle:

Benutzer, Ordner, Beiträge.

Folgendes will ich bezwecken: Ein Benutzer muss sich bei einem Ordner eintragen => Er empfängt alle Beiträge, die in diesem Ordner abgelegt sind. Er kann mehrere Ordner eintragen und somit viele Beiträge anschauen.

Meine Relations habe ich folgendermaßen gesetzt:

Benutzer:

-> Ordner: MANY_MANY

-> Beiträge: HAS_MANY

Ordner:

-> Benutzer: MANY_MANY

-> Beiträge: HAS_MANY

Beiträge:

-> Benutzer: BELONGS_TO

-> Ordner: BELONGS_TO

Ich möchte jetzt folgendes aus der Datenbank abfragen: Ich möchte alle Beiträge aus den Ordnern bekommen, welche der eingeloggte Benutzer (meinetwegen mit ID 3) eingetragen hat.

Daraus folgert sich ja ein Join mit 3 Tabellen. Wie kriege ich das mit Yii hin? Funktioniert das überhaupt mit einer SQL-Abfrage?

wie sind denn deine tabellen aufgebaut?

Vereinfacht:

Benutzer:

  • userid

  • name

Ordner:

  • ordnerid

  • title

Benutzer_Ordner:

  • userid

  • ordnerid

Beitrag:

  • ordnerid

  • content

so spontan:


Beitrag::model()->with('relOrdner.relBenutzer')->findAll('relbenutzer.userid=:id',array(':id'=>Yii::app()->user->id));

relOrdner ist der Name der Relation im Beitrags Model und relBenutzer die Relation im Ordner Model(die MANY_MANY halt)

Hallo,

ich bekomme zwar keinen Fehler, aber leider bekomme ich auch nicht die richtigen Beiträge.

Es werden manche Beiträge, die in dem Ordner sind, welchem dem User zugewiesen ist, nicht angezeigt

und andersrum.

Andere Vorschläge?

Danke!




//UserModel

public function getArticles()

    {

        return Article::model()->with(array(

            'folder' => array(

                'condition' => 'users.id = ?',

                'params' => array($this->id)

        )))->findAll();

    }


//ArticleModel

public function relations()

{

    return array(

        'folder' => array(self::BELONGS_TO, 'Folder', 'folderId', 'with' => 'users')

    );

}


//FolderModel

public function relations()

{

    return array(

        'users' => array(self::MANY_MANY, 'User', 'userFolder(userId, folderId)')

    );

}



Hallo mbi,

danke für deine Antwort! Funktioniert wunderbar und es ist alles drin im Array, was ich brauche.

Nur taucht noch folgendes Problem auf:

Wenn ich den Code, wie du gesendet hast, übernehme, funktioniert es. Wenn ich aber alles in einen

dataProvider packen, findet er die Tabelle nicht.

Dieser Code funktioniert:




return Article::model()->with(array(

            'folder' => array(

                'condition' => 'users.id = ?',

                'params' => array($this->id)

        )))->findAll();



Und dieser hier nicht:




$criteria = new CDbCriteria(array('with'=>array(

        'folder' => array(

                'condition' => 'users.id = ?',

                'params' => array($this->id)

        )

)));

	

$dataProvider=new CActiveDataProvider('Article', array('criteria'=>$criteria));



Bei diesem Code meckert er, dass er die Spalte users.id nicht findet.

Das ist doch komisch… Woran liegt das? Und wie kann ich es beheben?

schon mal den Sql Code aus dem Log verglichen?

Ich glaub da gabs ne Macke mit dem ActiveDataProvider mach mal testweise das:





$criteria = new CDbCriteria(array('with'=>array(

'folder' => array(

	'condition' => 'users.id = ?',

	'params' => array($this->id),

	'together'=>true

        )

)));

        

$dataProvider=new CActiveDataProvider('Article', array('criteria'=>$criteria));



Habe die beiden SQL-Codes verglichen. Wie bereits vermutet, fehlt

bei dem fehlerhaften Query der Join zur User-Tabelle…

Das together=>true schafft keine Abhilfe… Weitere Ideen?