Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何迭代Yii CActiveDataProvider对象?_Php_Mysql_Html_Yii - Fatal编程技术网

Php 如何迭代Yii CActiveDataProvider对象?

Php 如何迭代Yii CActiveDataProvider对象?,php,mysql,html,yii,Php,Mysql,Html,Yii,如何迭代dataprovider对象?我想访问返回的每一行的“name”字段并生成一个列表。你能帮忙吗 表格/模型的表格结构类别 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=InnoD

如何迭代dataprovider对象?我想访问返回的每一行的“name”字段并生成一个列表。你能帮忙吗

表格/模型的表格结构
类别

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;

}
$names=array();
公共函数returnCategoryNames()
{
$dataProvider=新的CActiveDataProvider(“类别”);
$dataProvider->setPagination(false);
$count=$dataProvider->totalItemCount();
对于($i=0;$i<$count;$i++){
//这就是我迷路的地方。。。
$myname=$dataProvider->data[$i]->name;
数组\u push($names,$myname);
}   
返回$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) {

如果需要Iterate大型数据采集,并且担心内存使用,请执行以下操作:

$dataProvider = new CActiveDataProvider('Categories');
$iterator = new CDataProviderIterator($dataProvider);
foreach($iterator as $category) {
   print_r($category);
}
CDATA ProviderIterator允许在大型数据集上进行迭代,而无需将整个数据集保存在内存中

一些性能测试

Test Time (seconds) Memory (bytes) CDbDataReader 4.9158580303192 28339952 CActiveRecord::findAll() 5.8891110420227 321388376 CDataProviderIterator 6.101970911026 31170504 测试时间(秒)内存(字节) CDbDataReader 4.9158580303192 28339952 CActiveRecord::findAll()5.8891110420227 321388376 CDATA ProviderInterator 6.101970911026 31170504
使用@ben rowe的解决方案,您可以同时查询所有行。您可能有内存问题

使用以下解决方案,您将从十乘十(默认值)获取类别:


在Yii2中,这也发生了变化:

    $searchModel = new ModelSearch();
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

    foreach($dataProvider->getModels() as $record) {
        echo $record->id . '<br>';
    }

    exit();
$searchModel=newmodelsearch();
$dataProvider=$searchModel->search(Yii::$app->request->queryParams);
foreach($dataProvider->getModels()作为$record){
echo$record->id.“
”; } 退出();

参考资料:

我非常喜欢您提供的第二个选项(Categories::model()。有没有一种方法可以使用此选项进行订购?或者这是因为askin太多了:
Categories::model()->findAll(数组('order'=>name'),您可以在以下位置找到有关find()命令的详细信息:CDATA提供程序仍将调用findAll(),它只允许您指定通过分页进行实际sql查询的次数。CDbDataReader仅进行1次sql调用,并以内存有效的方式对结果进行迭代。对于此解决方案,CDATA ProviderIterator与CDATA ProviderThanx不同!
    $searchModel = new ModelSearch();
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

    foreach($dataProvider->getModels() as $record) {
        echo $record->id . '<br>';
    }

    exit();