2011-10-27 112 views
0

我想加載一個cGridView與兩個表(慈善和投票)之間的查詢結果。Yii CGridView和SQL計數

試圖證明在表決表慈善機構的票數。投票表有一個FK給慈善機構。

我可以在SQL中使用左連接來做到這一點,但cGridView需要一個CActiveDataProvider對象來顯示數據,我不確定如何將兩個表連接起來以返回不僅計數的結果,而且也不會顯示任何等於0的結果並按票數排序。

我目前正在做的:

在投票型號:

public function relations() 
{ 
    return array(
     'voteCount'=>array(self::STAT, 'Vote', 'charity_id'), 
    ); 
} 

charity_id作爲FK爲慈善表。

然後建立CGridView部件:

$criteria=new CDbCriteria(array(
'with' => 'voteCount', 
)); 

$dataProvider=new CActiveDataProvider('Charity', array(
    'pagination' => false, 
    'criteria' => $criteria, 
)); 

$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider, 
    'ajaxUpdate'=>true, 
    'columns'=>array(
     'Name', 
     array(
      'name'=>'vote.voteCount', 
      'value'=>'CHtml::encode($data->voteCount)', 
     ), 
    ), 
)); 

現在它返回多個結果,我似乎無法弄清楚如何排序並添加where子句爲好。

任何幫助?

+1

因爲你不必使用CActiveDataProvider,可以使用CSqlDataProvider過的記錄,但根據ofcourse CActiveDataProvider的文檔是首選。 –

+0

我對標準並不太滿意,但是您絕對可以爲標準添加條件,例如 - '$ criteria-> condition ='voteCount> 0'' –

回答

0

儘量添加到慈善模式

public function relations() 
{ 
    return array(
     'vote'=>array(self::HAS_ONE, 'Vote', 'charity_id'), 
    ); 
} 

$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider, 
    'ajaxUpdate'=>true, 
    'columns'=>array(
     'Name', 
     array(
      'name'=>'Vote Count', 
      'value'=>'CHtml::encode($data->vote->voteCount)', 
     ), 
    ), 
)); 
0

您需要

Vote.php(投票模型)一些細微的變化

public function relations() 
{ 
    return array(
     'voteCount'=>array(self::STAT, 'Vote', 'charity_id'), 
    ); 
} 

添加在attributeLabels()

'voteCount'=>'Votes', 

and In C GridView控件添加「投票」列

$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider, 
    'ajaxUpdate'=>true, 
    'columns'=>array(
     'Name', 
     'Votes', 
    ), 
));