在YII中使用CDbcriteria为CgridView编写查询。

时间:2014-04-28 07:36:56

标签: php yii query-builder yii-components

我正在尝试在gridview中显示我的数据并且正在编写以下查询,我尝试使用CDBCriteria编写,

//query

SELECT user. * , jobs. * , COUNT( jobs.user_id ) 
FROM user
INNER JOIN jobs ON user.id = jobs.user_id
GROUP BY user.id

我尝试过以下内容:

$criteria = new CDbCriteria;
$criteria->select ='user.*,jobs.*';
$criteria->select ='COUNT(jobs.user_id)';
$criteria->select ='user';
$criteria->join   ='INNER JOIN jobs ON user.id = jobs.user_id';
$criteria->group  ='user.id';

return new CActiveDataProvider('manageemployers', array(
    'criteria'=>$criteria,

我的观点有以下代码。

 <?php
 $this->widget('zii.widgets.grid.CGridView', array(
     'dataProvider' =>$model->search(),
     //   'filter' => $model,
     'columns' => array(
         array(
             'name' => ' Employer ID',
             'type' => 'raw',
             'value' => 'CHtml::encode($data->id)',
             'htmlOptions' => array('style'=>'width:90px;','class'=>'zzz'),
             // 'filter'=>'false' /* for hiding filter boxes */

         [...]

?>

我的控制器

public function actionManageEmployers() {

    $user_id = Yii::app()->session['user_id'];
    if (Yii::app()->user->getId() === null)
        $this->redirect(array('site/login'));
    $model = new ManageEmployers();
    $model->user_id = $user_id;


    $this->render('manageemployers', array('model' => $model, 
    ));
}

但它不起作用。请帮我解决这个问题。谢谢!

2 个答案:

答案 0 :(得分:0)

修改

所以现在我能够理解你的问题,我试着用它解决这个问题。

我认为我有解决方案,您不需要像search()那样获取数据。你可以使用关系和其他东西来获取你的数据。

首先,我会像这样添加你的用户模型的关系:

'jobs' => array(self::HAS_MANY, 'Jobs', 'user_id')

之后,您可以使用$model->jobs

访问用户的所有作业

然后您需要撤消search() - 函数的更改。我的意思是它必须是这样的:

public function search()
{
    $criteria=new CDbCriteria;

    $criteria->compare('attribute',$this->attribute);
    //this is just an example ^

    return new CActiveDataProvider($this, array(
        'criteria'=>$criteria,
    ));
}

更改操作

$model = new ManageEmployers();

到此:

$model = new ManageEmployers("search");

视图中的更改

将这样的内容添加到colums数组:

array( 
    'name' => 'Total Jobs Posted',  
    'value' => 'count($data->jobs)', 
    'htmlOptions' => array('style'=>'width:90px;','class'=>'zzz'), 
)

答案 1 :(得分:0)

如果您设置了表关系,那么在您的用户模型(指您的用户表)中尝试编写CDbCriteria,如下所示:

$criteria = new CDbCriteria();
$criteria->with = array('jobs' => array('joinType' => 'STRAIGHT_JOIN'));
$criteria->together = true;
$criteria->addCondition('id = jobs.user_id');

return new CActiveDataProvider('manageemployers', array(
  'criteria' => $criteria
));