Frage

Wie kann ich Objekt mit allen Beziehungen zurückgeben (ANS -Sub -Objekt -Beziehungen?). Jetzt verwende ich EjsonBehavior, aber es gibt nur die Beziehungen zwischen den ersten Ebenen zurück, nicht von subbezogenen Objekten. Mein Quellcode:

    $order = Order::model()->findByPk($_GET['id']);
    echo $order->toJSON();
    Yii::app()->end();
War es hilfreich?

Lösung

Der eifrige Ladeansatz ruft die zugehörigen AR -Instanzen zusammen mit den Haupt -AR -Instanzen ab. Dies wird durch die Verwendung der Methode mit () mit einer der Find- oder Findall -Methoden in AR erreicht. Zum Beispiel,

$posts=Post::model()->with('author')->findAll();

Der obige Code gibt eine Reihe von Postinstanzen zurück. Im Gegensatz zum faulen Ansatz ist die Autor -Eigenschaft in jeder Postinstanz bereits mit der zugehörigen Benutzerinstanz gefüllt, bevor wir auf die Eigenschaft zugreifen. Anstatt eine Join -Abfrage für jeden Beitrag auszuführen, bringt der eifrige Ladeansatz alle Beiträge zusammen mit ihren Autoren in einer einzigen Join -Abfrage zurück!

Wir können mehrere Beziehungsnamen in der Methode mit () angeben, und der eifrige Ladungsansatz bringt sie alles in einer Aufnahme zurück. Beispielsweise bringt der folgende Code Beiträge zusammen mit ihren Autoren und Kategorien zurück:

$posts=Post::model()->with('author','categories')->findAll();

Wir können auch nestiertes Ladung verschachtelt. Anstelle einer Liste von Beziehungsnamen geben wir eine hierarchische Darstellung von Beziehungsnamen an die Methode mit () wie folgt.

$posts=Post::model()->with(
    'author.profile',
    'author.posts',
    'categories')->findAll();

Das obige Beispiel bringt alle Beiträge zusammen mit ihrem Autor und ihren Kategorien zurück. Es wird auch das Profil und die Beiträge jedes Autors zurückbringen.

Die eifrige Belastung kann auch ausgeführt werden, indem die CDBCriteria :: mit Eigenschaft angegeben wird, wie die folgenden:

$criteria=new CDbCriteria;
$criteria->with=array(
    'author.profile',
    'author.posts',
    'categories',
);
$posts=Post::model()->findAll($criteria);

oder

$posts=Post::model()->findAll(array(
    'with'=>array(
        'author.profile',
        'author.posts',
        'categories',
    )
);

Andere Tipps

Ich fand die Lösung dafür. Sie können $ row-> Attribute zum Erstellen von Daten verwenden

    $magazines = Magazines::model()->with('articles')->findAll();


    $arr = array();
    $i = 0;
    foreach($magazines as $mag)
    {   
        $arr[$i] = $mag->attributes;
        $arr[$i]['articles']=array();
        $j=0;
        foreach($mag->articles as $article){
            $arr[$i]['articles'][$j]=$article->attributes;
            $j++;
        }
        $i++;
    }
    print CJSON::encode(array(
            'code' => 1001,
            'magazines' => $arr,
        ));

Dies ist der beste Code, den ich nach langer Zeit gefunden habe, um diese Anforderung zu erfüllen. Dies wird wie wie funktionieren Charme.

 protected function renderJson($o) {
    //header('Content-type: application/json');
    // if it's an array, call getAttributesDeep for each record
    if (is_array($o)) {
        $data = array();
        foreach ($o as $record) {
            array_push($data, $this->getAttributes($record));
        }
        echo CJSON::encode($data);
    } else {
        // otherwise just do it on the passed-in object
        echo CJSON::encode($this->getAttributes($o));
    }

    // this just prevents any other Yii code from being output
    foreach (Yii::app()->log->routes as $route) {
        if ($route instanceof CWebLogRoute) {
            $route->enabled = false; // disable any weblogroutes
        }
    }
    Yii::app()->end();
}

protected function getAttributes($o) {
    // get the attributes and relations
    $data = $o->attributes;
    $relations = $o->relations();
    foreach (array_keys($relations) as $r) {
        // for each relation, if it has the data and it isn't nul/
        if ($o->hasRelated($r) && $o->getRelated($r) != null) {
            // add this to the attributes structure, recursively calling
            // this function to get any of the child's relations
            $data[$r] = $this->getAttributes($o->getRelated($r));
        }
    }
    return $data;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top