Как перебирать объект-дататор? Я хочу получить доступ к полю «имя» каждой возвращаемой строки и создать список. Вы можете помочь?
Структура таблицы для 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++; }