Question

Comment puis-je retourner l'objet avec toutes les relations (sous objets ans relations?). Maintenant, je l'utilise EJsonBehavior mais il ne retourne que les premières relations de niveau, pas des objets sous connexes. Mon code source:

    $order = Order::model()->findByPk($_GET['id']);
    echo $order->toJSON();
    Yii::app()->end();
Était-ce utile?

La solution

L'approche de chargement désireux récupère les instances AR connexes ainsi que la principale instance AR (s). Ceci est réalisé en utilisant le procédé avec en même temps que l'une des méthodes find ou findAll dans AR (). Par exemple,

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

Le code ci-dessus renvoie un tableau d'instances de poste. Contrairement à l'approche paresseuse, la propriété auteur dans chaque cas Post est déjà rempli avec l'instance liée utilisateur avant accéder à la propriété. Au lieu d'exécuter une requête de jointure pour chaque poste, l'approche de chargement avide ramène tous les messages en même temps que leurs auteurs dans une seule requête de jointure!

On peut spécifier plusieurs noms de relation dans la méthode avec () et l'approche de chargement désireux va les ramener en un seul coup. Par exemple, le code suivant ramènera les messages ainsi que leurs auteurs et catégories:

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

Nous pouvons également faire le chargement désireux imbriquée. Au lieu d'une liste de noms de relation, nous passons dans une représentation hiérarchique des noms de relation à la méthode avec (), comme suit,

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

L'exemple ci-dessus ramènera tous les messages en même temps que leur auteur et catégories. Il apportera également de nouveau le profil de chaque auteur et messages.

chargement Désireuse peut également être exécuté en spécifiant le CDbCriteria :: la propriété, comme suit:

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

ou

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

Autres conseils

J'ai trouvé la solution pour cela. vous pouvez utiliser $ ligne-> attributs pour créer des données

    $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,
        ));

Ceci est le meilleur morceau de code que j'ai trouvé après une longue recherche de temps pour répondre à cette exigence. Ce travail de volonté comme Charm .

 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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top