Pregunta

¿Cómo puedo devolver el objeto con todas las relaciones (ANS Sub Objects Relations?). Ahora uso Ejsonbehavior pero solo devuelve las relaciones de primer nivel, no los objetos subterrados. Mi código fuente:

    $order = Order::model()->findByPk($_GET['id']);
    echo $order->toJSON();
    Yii::app()->end();
¿Fue útil?

Solución

El enfoque de carga ansioso recupera las instancias AR relacionadas junto con las principales instancias de AR. Esto se logra utilizando el método con () junto con uno de los métodos Find o Findall en AR. Por ejemplo,

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

El código anterior devolverá una matriz de instancias post. A diferencia del enfoque perezoso, la propiedad del autor en cada instancia de la publicación ya está poblada con la instancia del usuario relacionada antes de acceder a la propiedad. En lugar de ejecutar una consulta de unión para cada publicación, ¡el enfoque de carga ansioso reúne todas las publicaciones junto con sus autores en una sola consulta de unión!

Podemos especificar múltiples nombres de relaciones en el método con () y el enfoque de carga ansioso los traerá de vuelta todos de una sola vez. Por ejemplo, el siguiente código traerá publicaciones junto con sus autores y categorías:

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

También podemos hacer una carga ansiosa anidada. En lugar de una lista de nombres de relaciones, pasamos una representación jerárquica de los nombres de relaciones al método con (), como el siguiente,

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

El ejemplo anterior traerá todas las publicaciones junto con su autor y categorías. También traerá de vuelta el perfil y las publicaciones de cada autor.

La carga ansiosa también se puede ejecutar especificando el CDBCriteria :: con la propiedad, como la siguiente:

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

o

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

Otros consejos

Encontré la solución para eso. Puede usar los atributos $ row-> para crear datos

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

Este es el mejor código que encontré después de una búsqueda de mucho tiempo para cumplir con este requisito. Esto funcionará como Encanto.

 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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top