2014-03-02 137 views
0

我正在Yii框架中工作。在我的索引行動我通過以下方式產生的數據提供程序爲foreach提供的參數無效()

$connection=Yii::app()->db; 
$user_id = Yii::app()->user->id; 
$sql = 'SELECT * FROM post 
     LEFT JOIN comment ON post.id = comment.post_id 
     AND comment.user_id =:user_id 
     LIMIT 0 , 30 '; 
$command=$connection->createCommand($sql); 
$command->bindParam(':user_id', $user_id,PDO::PARAM_STR); 

$rawData = $command->execute(); 

$dataProvider=new CArrayDataProvider($rawData, array(
        'id'=>'user', 
        'sort'=>array(
        'defaultOrder' => 'post.created', 
        ), 
        'pagination'=>array(
        'pageSize'=>10, 
        ), 
     )); 

然後我渲染索引視圖

$this->render('index',array(
      'dataProvider'=>$dataProvider, 
      'category_id'=>$category_id, 
     )); 

索引視圖做

<?php $this->widget('zii.widgets.CListView', array(
    'dataProvider'=>$dataProvider, 
    'itemView'=>'_view', 
)); ?> 

這導致錯誤

Invalid argument supplied for foreach() 

C:\wamp\www\yii\framework\web\CArrayDataProvider.php(140) 

    * @param array $directions the sorting directions (field name => whether it is descending sort) 
     */ 

    136   foreach($directions as $name=>$descending) 
137   { 
138    $column=array(); 
139    $fields_array=preg_split('/\.+/',$name,-1,PREG_SPLIT_NO_EMPTY); 
140    foreach($this->rawData as $index=>$data) 
141     $column[$index]=$this->getSortingFieldValue($data, $fields_array); 
142    $args[]=&$column; 
143    $dummy[]=&$column; 
144    unset($column); 
145    $direction=$descending ? SORT_DESC : SORT_ASC; 
146    $args[]=&$direction; 
147    $dummy[]=&$direction; 
148    unset($direction); 
149   } 

你能幫我嗎? 提前致謝

回答

0

如果你var_dump($rawData),你會看到它是一個整數(或0),只返回結果數。

這是因爲你使用$command->execute()時,你應該使用:

$command->queryAll(); 

這將返回結果的數組,你可以傳遞到CActiveDataProvider

+0

非常感謝。它通過了ClistView,但在我的_view.php中出現錯誤在第8行的C:\ wamp \ www \ contest \ protected \ views \ contest \ _view.php中的非對象上調用成員函數getAttributeLabel該命令是<?php echo CHtml :: encode($ data-> getAttributeLabel('id')); ?>: klark

+0

這是因爲您要傳入CActiveDataProvider的'rawData'只是一個數據數組。爲了能夠使用getAttributeLabel() - CModel/CActiveRecord方法 - 非常理想,您需要向CActiveDataProvider發送一個CActiveRecord對象數組。你需要修改你的數據庫查詢來做到這一點 - 使用CDbCriteria我建議 – JamesG

+0

實際上,我想避免使用Activerecord來獲得更好的數據庫訪問對象(DAO)性能, – klark