Структура массива, возвращаемая моделью 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.