2016-06-29 7 views
2

Yii2 Вспомогательный метод ArrayHelper toArray не преобразует вложенные объекты.Yii2 ArrayHelper :: toArray не работает рекурсивно

Вот мой тестовый код.

public function actionTest() 
{ 
    $product = \common\models\Product::find() 
     ->where(['id' => 5779]) 
     ->with('firstImage') 
     ->one(); 

    $product = \yii\helpers\ArrayHelper::toArray($product); 

    print_r($product); 
} 

Рекурсивное свойство включено по умолчанию.

общественный статический массив ToArray (объект $, $ свойства = [], $ рекурсивный = верно)

Так что этот кусок кода должен работать правильно, но это не так.

Действие возвращает один уровень массива без firstImage объект.

Что я здесь делаю неправильно?

PS: Код был упрощен для целей тестирования. Я знаю, что в этой конкретной ситуации можно просто использовать метод asArray() для получения записи AR в массиве.

ответ

2

Вы должны использовать вместо этого:

$product = \common\models\Product::find() 
    ->where(['id' => 5779]) 
    ->with('firstImage') 
    ->asArray() 
    ->one(); 

Подробнее о Retrieving Data in Arrays.

Если вы действительно хотите использовать toArray(), и поскольку отношение не является действительно атрибутом или свойством, вы должны просто использовать второй параметр, например. :

$product = \yii\helpers\ArrayHelper::toArray($product, [ 
    'common\models\Product' => [ 
     // add needed properties here 
     // ... 
     'firstImage', 
    ], 
]); 

Или, если вы используете REST, вы можете переопределить extraFields() в модели:

public function extraFields() 
{ 
    return ['firstImage']; 
} 

Подробнее о .

+0

Я знаю это. Код был намеренно упрощен для целей тестирования. Есть несколько более сложных случаев, когда мне нужно преобразовать объект AR в массив. И мне нужно, чтобы он работал рекурсивно. – Alliswell

+0

Кажется, что все нормально. Благодаря! – Alliswell

+0

этим, он должен добавить все свойства модели, он будет длинным. есть ли какой-нибудь точный метод для этого? так что все модели и связанные с ними модели появятся в массиве. – FSShaikh

 Смежные вопросы

  • Нет связанных вопросов^_^