Yii JSON с отношениями - PullRequest
       19

Yii JSON с отношениями

2 голосов
/ 27 апреля 2011

Как я могу вернуть объект со всеми отношениями (отношения с подчиненными объектами?). Теперь я использую EJsonBehavior, но он возвращает только отношения первого уровня, а не подчиненные объекты. Мой исходный код:

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

Ответы [ 3 ]

3 голосов
/ 09 декабря 2011

Я нашел решение для этого. вы можете использовать $ row-> атрибуты для создания данных

    $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,
        ));
3 голосов
/ 27 апреля 2011

Стремительный подход загрузки извлекает связанные экземпляры AR вместе с основными экземплярами AR. Это достигается с помощью метода with () вместе с одним из методов find или findAll в AR. Например,

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

Приведенный выше код вернет массив экземпляров Post. В отличие от ленивого подхода, свойство author в каждом экземпляре Post уже заполняется связанным экземпляром User, прежде чем мы получим доступ к свойству. Вместо того, чтобы выполнять запрос на соединение для каждого поста, подход к быстрой загрузке возвращает все посты вместе с их авторами в один запрос на объединение!

Мы можем указать несколько имен отношений в методе with (), и подход к быстрой загрузке вернет их всех за один раз. Например, следующий код вернет сообщения вместе с их авторами и категориями:

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

Мы также можем выполнять вложенную загрузку. Вместо списка имен отношений мы передаем иерархическое представление имен отношений методу with (), как показано ниже:

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

Приведенный выше пример вернет все сообщения вместе с их автором и категориями. Он также вернет профиль и сообщения каждого автора.

Стремительную загрузку также можно выполнить, указав свойство CDbCriteria :: with, например:

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

или

$posts=Post::model()->findAll(array(
    'with'=>array(
        'author.profile',
        'author.posts',
        'categories',
    )
);
0 голосов
/ 15 ноября 2018

Это лучший фрагмент кода, который я нашел после длительного поиска, чтобы удовлетворить это требование. Это будет работать как 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;
}
...