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;
}
3条答案
按热度按时间q3qa4bjr1#
快速加载方法检索相关AR示例和主AR示例。这是通过在AR中使用with()方法和find或findAll方法之一来实现的。例如,
上面的代码将返回一个Post示例数组。与惰性方法不同,每个Post示例中的author属性在我们访问该属性之前就已经用相关的User示例填充了。而不是对每个帖子执行一个连接查询,急切加载方法在一个连接查询中将所有帖子及其作者一起返回!
我们可以在with()方法中指定多个关系名称,而快速加载方法将一次性返回所有关系名称。例如,下面的代码将返回帖子及其作者和类别:
我们也可以进行嵌套式的急切加载,我们传递关系名称的层次表示给with()方法,而不是关系名称的列表,如下所示:
上面的例子将返回所有帖子及其作者和分类,也将返回每个作者的个人资料和帖子。
还可以通过指定CDbCriteria::with属性来执行紧急加载,如下所示:
或
z18hc3ub2#
我找到了解决这个问题的方法。你可以使用$row-〉attributes来创建数据
uklbhaso3#
这是我经过长时间搜索后找到的最好的一段代码,可以满足这个要求。这将像Charm一样工作。