2016-08-19 2 views
0

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.

+0

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

+0

@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

+0

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

Antwort

2

Ich habe nicht geprüft, aber man könnte versuchen:

$post = Post::find() 
     ->joinWith('user') 
     ->joinWith(['comments' => function($q) { 
      $q->joinWith(['user']); 
     }]) 
     ->asArray() 
     ->all(); 
} 
+0

Dies wird nur Beiträge mit Kommentaren zurückgeben. – lilbiscuit

+0

Haben Sie es versucht? joinWith erzeugt einen linken Join, so dass es merkwürdig erscheint, dass nur Post mit Kommentaren zurückgegeben wird. –

+0

Ich habe versucht, aber Active Record 'joinWith' ist ein innerer Join, [nicht ein linker Join] (http://www.yiiframework.com/doc-2.0/yii-db-activequery.html#relational-query). – lilbiscuit