【问题标题】:Array structure returned by Yii's modelYii 模型返回的数组结构
【发布时间】:2012-09-30 19:58:20
【问题描述】:

我是一名 Yii 初学者,遇到了一些困难,希望有人能够帮助我重回正轨。我认为这对于经验丰富的 Yii 用户来说可能是一个相当直截了当的问题。所以这里...

在控制器中,假设我对模型运行以下调用-

$variable = Post::model()->findAll();

一切正常,我将变量传递到视图中。这就是我陷入困境的地方。上述查询中返回的数组比我预期的要复杂得多,我正在努力理解它。这是一个示例-

print_r($variable);

给-

Array ( [0] => Post Object ( [_md:CActiveRecord:private] => CActiveRecordMetaData Object                             ( [tableSchema] => CMysqlTableSchema Object ( [schemaName] => [name] => tbl_post [rawName] => `tbl_post` [primaryKey] => id [sequenceName] => [foreignKeys] => Array ( ) [columns] => Array ( [id] => CMysqlColumnSchema Object ( [name] => id [rawName] => `id` [allowNull] => [dbType] => int(11) [type] => integer [defaultValue] => [size] => 11 [precision] => 11 [scale] => [isPrimaryKey] => 1 [isForeignKey] => [autoIncrement] => 1 [_e:CComponent:private] => [_m:CComponent:private] => ) [post] => CMysqlColumnSchema Object ( [name] => post [rawName] => `post` [allowNull] => [dbType] => text [type] => string [defaultValue] => [size] => [precision] => [scale] => [isPrimaryKey] => [isForeignKey] => [autoIncrement] => [_e:CComponent:private] => [_m:CComponent:private] => ) ) [_e:CComponent:private] => [_m:CComponent:private] => ) [columns] => Array ( [id] => CMysqlColumnSchema Object ( [name] => id [rawName] => `id` [allowNull] => [dbType] => int(11) [type] => integer [defaultValue] => [size] => 11 [precision] => 11 [scale] => [isPrimaryKey] => 1 [isForeignKey] => [autoIncrement] => 1 [_e:CComponent:private] => [_m:CComponent:private] => ) [post] => CMysqlColumnSchema Object ( [name] => post [rawName] => `post` [allowNull] => [dbType] => text [type] => string [defaultValue] => [size] => [precision] => [scale] => [isPrimaryKey] => [isForeignKey] => [autoIncrement] => [_e:CComponent:private] => [_m:CComponent:private] => ) ) [relations] => Array ( [responses] => CHasManyRelation Object ( [limit] => -1 [offset] => -1 [index] => [through] => [joinType] => LEFT OUTER JOIN [on] => [alias] => [with] => Array ( ) [together] => [scopes] => [name] => responses [className] => Response [foreignKey] => post_id [select] => * [condition] => [params] => Array ( ) [group] => [join] => [having] => [order] => [_e:CComponent:private] => [_m:CComponent:private] => ) ) [attributeDefaults] => Array ( ) [_model:CActiveRecordMetaData:private] => Post Object ( [_md:CActiveRecord:private] => CActiveRecordMetaData Object *RECURSION* [_new:CActiveRecord:private] => [_attributes:CActiveRecord:private] => Array ( ) [_related:CActiveRecord:private] => Array ( ) [_c:CActiveRecord:private] => [_pk:CActiveRecord:private] => [_alias:CActiveRecord:private] => t [_errors:CModel:private] => Array ( ) [_validators:CModel:private] => [_scenario:CModel:private] => [_e:CComponent:private] => [_m:CComponent:private] => ) ) [_new:CActiveRecord:private] => [_attributes:CActiveRecord:private] => Array ( [id] => 1 [post] => User Post ) [_related:CActiveRecord:private] => Array ( ) [_c:CActiveRecord:private] => [_pk:CActiveRecord:private] => 1 [_alias:CActiveRecord:private] => t [_errors:CModel:private] => Array ( ) [_validators:CModel:private] => [_scenario:CModel:private] => update [_e:CComponent:private] => [_m:CComponent:private] => ) )

[对不起,如果有更简单的方法来显示这个数组,我不知道]

谁能向我解释为什么模型返回如此复杂的数组?在您的应用程序中使用什么表、列或关系似乎并不重要,在我看来它们都返回这种格式。

另外,有人可以向我解释一下结构,以便我可以隔离我想要恢复的变量吗?

非常感谢,

尼克

【问题讨论】:

  • 我没有使用过 Yii 框架,但也许他们提供了一个 var_dump 替代品。快速谷歌搜索给了我“CVarDumper”,看看它替换“print_r/var_dump”。
  • 您好,Clentfort,感谢您的意见。不幸的是,它似乎并没有以更容易理解的方式显示数组。

标签: php web-applications yii


【解决方案1】:

更好的 print_r

要在 yii 中获得更好的 print_r 输出,您可以使用 CVarDumper 类的 dump()dumpAsString() 方法。他们还提供了一个参数$highlight,通过正确格式化输出并为其添加缩进,这将帮助您理解输出。示例:

CVarDumper::dump($variables,10,true);
// 10 is the default depth, and passing true will enable highlighting

为什么和什么结构?

正如其他答案中已经提到的findAll() 返回一个CActiveRecord 对象 的数组,所以$variables 是一个对象数组,$variables[0] 是第一个 Post 对象。 Yii 的 CActiveRecord 有许多对象属性,例如一个 CActiveRecordMetaData 对象,它又具有一个 CDbTableSchema 对象(你有它的子类 CMysqlTableSchema,这意味着你正在使用 mysql)。 print_r 只是打印出这些对象,它们只是主 CActiveRecord 对象的属性。除了这些对象之外,CActiveRecord 的 attributes 属性(它是一个数组)保存了您的实际属性值,因此在输出中的某处您还会看到这样的数组:

[CActiveRecord:_attributes] => array
(
    'attributeName' => 'attributeValue'
    'anotherAttributeName' => 'anotherAttributeValue'
    'someAttributeName' => 'someAttributeValue'
    ...
)

这些是你的属性值。


如何访问?

要访问模型的属性,我们可以使用对象属性访问和关联数组访问(可能是因为 CActiveRecord 的父类 CModel 实现了 php 的 ArrayAccess interface)。示例:

$variables[0]->attributeName;
$variables[0]['attributeName'];

而且由于 yii 使用并覆盖了 __get php 魔术方法,我们可以这样做:

$variables[0]->attributeName;
// instead of 
$variables[0]->attributes['attributeName'];

当然,您可以使用 foreach() 遍历 Post 对象数组,如此处另一个答案所示:

foreach($variables as $aPost){
    echo $aPost->attributeName;
    echo $aPost['attributeName'];
    echo $aPost->attributes['attributeName'];
}

要访问关系,只需使用关系名称:

$variables[0]->relationName->attributeOfRelatedTable;
$variables[0]['relationName']->attributeOfRelatedTable;
$variables[0]['relationName']['attributeOfRelatedTable'];

如果你的关系是HAS_MANY,那么当然相关模型也会以数组的形式返回:

$variables[0]->relationName[0]->attributeOfRelatedTable;
$variables[0]['relationName'][0]->attributeOfRelatedTable;
$variables[0]['relationName'][0]['attributeOfRelatedTable'];
$variables[0]->relationName[0]['attributeOfRelatedTable'];

在 HAS_MANY 关系的情况下,您可以再次遍历关系数组。

编辑:has_many 迭代的示例:

foreach($variables as $aPost) { // get each post one by one
    echo $aPost->someAttribute; // or $aPost['someAttribute']
    foreach($aPost->relationName as $aComment) { // say we get each comment of each post
        // or could have done $aPost['relationName'] as $aComment
        echo $aComment->commentAttribute; // or $aComment['commentAttribute']
    }
}

【讨论】:

  • 谢谢,这已经回答了我的问题以及我将要问的所有后续问题。非常感谢。感谢所有帮助我的人。
  • 总是乐于提供帮助。我尽量做到彻底:)
  • 事实证明我实际上在循环 HAS_MANY 关系时遇到了麻烦。我有多个帖子,每个帖子可能有多个回复。我想使用两个嵌套的 foreach 循环来迭代这些。我无法获得正确的语法。我通常喜欢自己解决问题,但是在 Yii 的这个元素上我失败了。我不认为您会在答案中为此添加解决方案?我认为它可能会帮助除了我自己以外的其他初学者。我会欠你的:)
  • ok 添加了另一个用于循环 has_many 关系的代码示例。
【解决方案2】:

findall 为您的模型返回一个活动记录数组 see here

一旦你有了它,你就可以像这样访问返回的每条记录中的所有列

$results = Post::model()->findAll();
foreach($results AS $model) 
{
    echo $model->somecolumnname;
    echo $model->someothercolumnname;
}

因此,您不必过多关注引擎盖下的所有细节,因为您可以直接使用抽象。

【讨论】:

    【解决方案3】:

    一个简单的答案是使用,

    print_r($variable->attributes);
    

    其中$variable 是模型类的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-02
      • 2013-08-02
      • 2011-05-25
      • 2012-02-05
      • 1970-01-01
      相关资源
      最近更新 更多