eri*_*ric 12 html php mysql yii
如何迭代dataprovider对象?我想访问返回的每行的'name'字段并构建一个列表.你能帮我吗?
表/模型的表结构 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 ;
Run Code Online (Sandbox Code Playgroud)
*我的控制器类别中的功能*
$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;
}
Run Code Online (Sandbox Code Playgroud)
Ben*_*owe 20
试试这个:
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);
}
Run Code Online (Sandbox Code Playgroud)
但是,您不需要使用数据提供程序,而只需使用该模型
foreach(Categories::model()->findAll() as $record) {
Run Code Online (Sandbox Code Playgroud)
Aki*_*lar 14
如果你需要itarate大数据收集而你担心内存使用,请执行以下操作:
$dataProvider = new CActiveDataProvider('Categories');
$iterator = new CDataProviderIterator($dataProvider);
foreach($iterator as $category) {
print_r($category);
}
Run Code Online (Sandbox Code Playgroud)
CDataProviderIterator允许对大型数据集进行迭代,而无需将整个集合保存在内存中.
一些性能测试
Test Time (seconds) Memory (bytes) 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();
Run Code Online (Sandbox Code Playgroud)
参考:getModels()