我如何返回具有所有关系的对象(以及子对象关系?)。现在我使用 EJsonBehavior 但它只返回第一级关系,而不是子相关对象。我的源代码:
$order = Order::model()->findByPk($_GET['id']);
echo $order->toJSON();
Yii::app()->end();
我如何返回具有所有关系的对象(以及子对象关系?)。现在我使用 EJsonBehavior 但它只返回第一级关系,而不是子相关对象。我的源代码:
$order = Order::model()->findByPk($_GET['id']);
echo $order->toJSON();
Yii::app()->end();
急切加载方法检索相关的 AR 实例以及主要的 AR 实例。这是通过使用 with() 方法和 AR 中的 find 或 findAll 方法之一来完成的。例如,
$posts=Post::model()->with('author')->findAll();
上面的代码将返回一个 Post 实例数组。与惰性方法不同,在我们访问属性之前,每个 Post 实例中的 author 属性已经填充了相关的 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',
)
);
我找到了解决方案。您可以使用 $row->attributes 创建数据
$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,
));
这是我经过长时间搜索找到的满足此要求的最佳代码。这将像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;
}