Как перебрать объект Yii CActiveDataProvider?

Как перебирать объект-дататор? Я хочу получить доступ к полю «имя» каждой возвращаемой строки и создать список. Вы можете помочь?

Структура таблицы для categories таблицы / модели

 CREATE TABLE IF NOT EXISTS `categories` ( `idCategory` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(64) NOT NULL, PRIMARY KEY (`idCategory`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=55 ; 

* Функция в моих категориях контроллеров *

  $names = array(); public function returnCategoryNames() { $dataProvider= new CActiveDataProvider('Categories'); $dataProvider->setPagination(false); $count = $dataProvider->totalItemCount(); for($i = 0; $i < $count; $i++){ // this is where I am lost... $myname = $dataProvider->data[$i]->name; array_push($names, $myname); } return $names; } 

Попробуй это:

 public function returnCategoryNames() { $dataProvider= new CActiveDataProvider('Categories'); $dataProvider->setPagination(false); //$count = $dataProvider->totalItemCount(); $names = array(); foreach($dataProvider->getData() as $record) { $names[] = $record->name; } return array_unique($names); } 

Однако вам не нужно использовать поставщика данных, вместо этого просто используйте модель

 foreach(Categories::model()->findAll() as $record) { 

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

 $dataProvider = new CActiveDataProvider('Categories'); $iterator = new CDataProviderIterator($dataProvider); foreach($iterator as $category) { print_r($category); } 

CDataProviderIterator позволяет выполнять итерацию на больших наборах данных без сохранения всего набора в памяти.

некоторые тесты производительности

 Время тестирования (в секундах) Память (байты)
 CDbDataReader 4.9158580303192 28339952
 CActiveRecord :: findAll () 5.8891110420227 321388376
 CDataProviderIterator 6.101970911026 31170504

В Yii2 это тоже изменилось:

  $searchModel = new ModelSearch(); $dataProvider = $searchModel->search(Yii::$app->request->queryParams); foreach($dataProvider->getModels() as $record) { echo $record->id . '<br>'; } exit(); 

Ссылка: getModels ()

С помощью решения @ ben-rowe вы запрашиваете сразу все строки. У вас могут быть проблемы с памятью.

При следующем решении вы получите категории от десяти до десяти (значение CPagination.pageSize по умолчанию):

  $dataProvider = new CActiveDataProvider('Categories', array( 'pagination' => array( 'validateCurrentPage' => false ), )); $pagination = $dataProvider->pagination; while ($categories = $dataProvider->getData(true)){ foreach ($categories as $category) { //... } $pagination->currentPage++; }