incendium
(Townie Rettie)
March 20, 2011, 9:08am
1
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?
mbi
(mbi)
March 20, 2011, 10:22am
2
wie sind denn deine tabellen aufgebaut?
Command
(Command)
March 20, 2011, 11:53am
4
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)
incendium
(Townie Rettie)
March 20, 2011, 12:23pm
5
Command:
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!
mbi
(mbi)
March 20, 2011, 4:44pm
6
//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)')
);
}
incendium
(Townie Rettie)
April 1, 2011, 4:50pm
7
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?
Command
(Command)
April 2, 2011, 12:11pm
8
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));
incendium
(Townie Rettie)
April 2, 2011, 1:29pm
9
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?