Ich habe eine yii App mit einem Rest API. Ich möchte ein Post-Objekt mit allen Kommentaren für diesen Post sowie das Benutzerobjekt für den Ersteller des Posts erhalten. Auch in den Kommentaren möchte ich das Benutzerobjekt für jeden Benutzer, der einen Kommentar hinterlassen.Yii REST API - mit mehreren Joins in Abfrage
So ein Beitrag mit Post-Benutzer und viele Kommentare jeweils mit Benutzer.
Die Post-Controller die api Anfrage dient sieht wie folgt aus:
public function actionIndex(){
$post = Post::find()
->joinWith('user)
->joinWith('comments')
->asArray()
->all();
}
return $post;
dann die verschiedenen Modelle für Benutzer und Kommentar:
public function getUser()
{
return $this->hasOne(User::className(), ['id' => 'created_by'])->innerJoinWith('profile p1');
}
public function getComments()
{
return $this->hasMany(Comment::className(), ['object_id' => 'id'])->leftJoin('user u2', 'u2.id = comment.created_by');
}
Der Benutzer für die Post kehrt in Ordnung. Die Kommentare werden zurückgegeben. Aber für jeden Kommentar gibt es keinen zurückgegebenen Benutzer. Ich fühle mich wie die linke Join in der Methode getComments() sollte den Benutzer ziehen. Was fehlt?
ich wieder so etwas wie dieses:
{
"id":"1",
"message":"this is a post",
"user":
[{
"id:11",
"name":"bob smith"
}],
"comments":
[{
"id:21",
"remark":"this is a comment"
}]
}
und ich möchte dies zurück:
{
"id":"1",
"message":"this is a post",
"user":
[{
"id:11",
"name":"bob smith"
}],
"comments":
[{
"id:21",
"remark":"this is a comment",
"user":
[{
"id:41",
"name":"jane doe"
}]
}]
}
UPDATE: Wenn ich getComments()
leftJoin
-innerJoinWith
wie folgt zu ändern:
public function getComments()
{
return $this->hasMany(Comment::className(), ['object_id' => 'id'])->innerJoinWith('user u2', 'u2.id = comment.created_by');
}
... dann bekomme ich die richtig formatierte Ausgabe, aber es enthält nur Beiträge, die Kommentare enthalten.
Es ist eigentlich falsch aus meiner Sicht. Bitte lesen Sie dies - http://www.yiiframework.com/doc-2.0/guide-rest-resources.html Lesen Sie über expand Teil und extraFields. – ineersa
@ineersa Ich lese das ... nicht sicher, wie das zu implementieren ist. Ich habe einen Code hinzugefügt, der die Frage stellt, ob Sie das überprüfen können. – lilbiscuit
Das ist nicht so einfach, um es richtig zu machen, einfach '' mit() 'anstelle von' joinWith() 'in Ihrer Controller-Aktion, dann' user' und 'Kommentare' zu' extraFields' hinzufügen, dann Link mit 'expand verwenden = Benutzer, Kommentare zu Ihrer Aktion. Versuchen Sie in 'getComments() ', Daten mit' joinWith() 'zu laden. Sollte den Trick machen. – ineersa