Структура массива, возвращаемая моделью Yii

Я начинающий Yii и бегу в немного стены и надеюсь, что кто-то сможет помочь мне вернуться на трек. Я думаю, что это может быть довольно прямой вопрос к опытному пользователю Yii. Вот так...

в контроллере, скажем, я запускаю следующий вызов модели -

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

все работает нормально, и я передаю переменную в представление. Вот тут-то я и застрял. Массив, возвращаемый в приведенном выше запросе, намного сложнее, чем Я предвидел, и я изо всех сил пытаюсь понять это. Вот образец ... --4-->

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

[извините, если есть более простой способ показать этот массив, я не знаю об этом]

может ли кто-нибудь объяснить мне, почему модель возвращает такой сложный массив? Кажется, не имеет значения, какие таблицы или столбцы или отношения используются в вашем приложении, все они, как мне кажется, возвращают этот формат.

кроме того, может кто-нибудь объяснить мне структуру, чтобы я можно выделить переменные, которые я хочу восстановить?

заранее большое спасибо,

Ник

3 ответов


лучше print_r

и print_r вывод в yii, вы можете использовать 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. CActiveRecord Yii имеет множество свойств, которые являются объектами, например объект CActiveRecordMetaData, который, в свою очередь, имеет объект CDbTableSchema (и у вас есть его подкласс CMysqlTableSchema, что означает, что вы используете mysql). The print_r просто распечатывает эти объекты, которые являются не чем иным, как свойствами основного объекта CActiveRecord. В дополнение к этим возражает attributes свойство (которое является массивом) CActiveRecord содержит ваши фактические значения атрибутов, поэтому где-то в выходных данных вы также увидите такой массив:

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

это ваши значения атрибутов.


как получить доступ?

для доступа к свойствам модели мы можем использовать как доступ к свойствам объекта, так и доступ к ассоциативному массиву (возможно, потому, что родительский класс CModel CActiveRecord реализует php интерфейса ArrayAccess интерфейс). Пример:

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

и поскольку yii использует и переопределяет метод _ _ get php magic, мы можем сделать:

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

и, конечно, вы можете перебирать массив объектов Post с помощью foreach() как уже показано в другом ответе здесь:

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.

Edit: пример для итерации 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']
    }
}

findall возвращает массив активных записей для вашей модели посмотреть здесь

Как только у вас есть, что вы можете получить доступ ко всем столбцам в каждой записи, возвращенной так

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

поэтому вам не нужно слишком беспокоиться обо всех этих деталях под капотом, поскольку вы можете просто использовать абстракцию напрямую.


простой ответ на это использовать,

print_r($variable->attributes);

здесь $variable является объектом класса Model.