6

私は 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] => ) )

[この配列を表示する簡単な方法があれば申し訳ありませんが、私はそれを認識していません]

モデルがこのような複雑な配列を返す理由を誰か説明できますか? アプリケーションでどのテーブル、列、またはリレーションが使用されているかは問題ではないようです。それらはすべてこの形式を返すように思えます。

また、回復したい変数を分離できるように、構造を説明してもらえますか?

よろしくお願いします。

ニック

4

3 に答える 3

21

より良い 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

なぜ、どのような構造ですか?

他の回答で既に述べたように、CActiveRecord オブジェクトfindAll()の配列を返すため、オブジェクトの配列であり、最初の Post オブジェクトです。Yii の CActiveRecord には、オブジェクトであるプロパティのホストがあります。たとえば、CActiveRecordMetaData オブジェクトは、CDbTableSchema オブジェクトを持ちます (そして、CMysqlTableSchema のサブクラスを持っています。これは、mysql を使用していることを意味します)。これらのオブジェクトは、メインの CActiveRecord オブジェクトのプロパティにすぎません。これらのオブジェクトに加えて、CActiveRecord のプロパティ (配列) が実際の属性値を保持するため、出力のどこかに次のような配列も表示されます。$variables$variables[0]print_rattributes

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

それらはあなたの属性値です。


アクセス方法は?

モデルのプロパティにアクセスするには、オブジェクト プロパティ アクセスと連想配列アクセスの両方を使用できます (おそらく、CActiveRecord の親クラス CModel が php のArrayAccess インターフェイスを実装しているためです)。例:

$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']
    }
}
于 2012-10-01T09:35:59.510 に答える
2

findall は、モデルのアクティブなレコードの配列を返しますここを参照してください

それができたら、返された各レコードのすべての列にアクセスできます

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

したがって、抽象化を直接使用できるので、ボンネットの下のすべての詳細についてあまり気にする必要はありません。

于 2012-10-01T06:08:45.383 に答える
1

これに対する簡単な答えは、

print_r($variable->attributes);

ここ$variableで、モデル クラスのオブジェクトです。

于 2013-02-28T11:29:47.480 に答える