Yii-在带有CActiveDataProvider的CDbCriteria中使用联接查询时出现排序错误

Yii-在带有CActiveDataProvider的CDbCriteria中使用联接查询时出现排序错误,yii,cgridview,yii-cmodel,yii-cactiverecord,Yii,Cgridview,Yii Cmodel,Yii Cactiverecord,模型搜索方法 $criteria->alias = 'c'; $criteria->select = 'c.*,max(ca.date) AS lastactivity'; $criteria->join = 'LEFT JOIN tbl_contact_action AS ca ON (ca.contact_id=c.contact_id)'; $criteria->condition = 'c.status<>"Deleted"'; $

模型搜索方法

  $criteria->alias = 'c';
  $criteria->select = 'c.*,max(ca.date) AS lastactivity';
  $criteria->join = 'LEFT JOIN tbl_contact_action AS ca ON (ca.contact_id=c.contact_id)';
  $criteria->condition = 'c.status<>"Deleted"';
  $criteria->group = 'c.contact_id';
  $criteria->order = 'lastactivity DESC';

$sort = new CSort;
        $sort->defaultOrder = array('lastactivity' => CSort::SORT_DESC); //'name ASC';        
        $sort->attributes = array(
            'name' => 'name',
            'email' => 'email',
            'status' => 'status',
            'createdon' => 'createdon',
            'lastactivity' => 'lastactivity',
        );
        $sort->applyOrder($criteria);
        return new CActiveDataProvider($this, array(
            'criteria' => $criteria,
            'sort' => $sort,            
        ));
$criteria->alias='c';
$criteria->select='c.*,max(ca.date)作为lastactivity';
$criteria->join='LEFT join tbl\u contact\u action AS ca ON(ca.contact\u id=c.contact\u id)';
$criteria->condition='c.status“Deleted';
$criteria->group='c.contact_id';
$criteria->order='lastactivity DESC';
$sort=新排序;
$sort->defaultOrder=array('lastactivity'=>CSort::sort_DESC);//命名为ASC’;
$sort->attributes=数组(
“名称”=>“名称”,
“电子邮件”=>“电子邮件”,
“状态”=>“状态”,
“createdon”=>“createdon”,
“lastactivity”=>“lastactivity”,
);
$sort->applyOrder($criteria);
返回新的CActiveDataProvider($this,array(
“条件”=>$criteria,
“排序”=>$sort,
));
基本上,我有一个1:n的关系,在这个关系中,我只需要子表中的最新记录。父表数据将基于在子表中最新完成的注释显示。如何使此字段可排序

错误

CDbCommand无法执行SQL语句:SQLSTATE[42S22]:找不到列:1054“order子句”中的未知列“c.lastactivity”。

只是一个理论: 因为您有一个连接到一起的sql,所以所有的数据都将在一个结果中连接在一起。我不确定您是否仍然可以使用$data->ca->date,因为您的数据不是已知的活动记录类型

试一试推杆

$criteria->select = 'maintable.*,ca.date as ca_date'; 
那么你应该可以使用

       array(
          'header' => 'Last Activity',
          'class' => 'gridDataColumn',
          'value' => '$data->ca_date',                           
       ),

下面是允许自定义/计算字段可排序的模型。不是简单地在排序数组中写入'lastactivity'=>'lastactivity',而是传递整个数组。希望对某人有所帮助:)

类联系人扩展了CActiveRecord{

public $verifyCode;
public $lastactivity;

public static function model($className = __CLASS__) {
    return parent::model($className);
}

public function tableName() {
    return '{{contact}}';
}

public function rules() {
    return array(
        array('name, email, subject, message', 'required', 'message' => Yii::t('app', 'MSG_ATTRIBUTE_BLANK')),
        array('email', 'email'),
        array('verifyCode', 'CaptchaExtendedValidator', 'allowEmpty' => !CCaptcha::checkRequirements(), 'on' => 'fContact'),
        array('name, email,subject,message,lastactivity', 'safe', 'on' => 'search'),
        array('name, subject, email, message, status,createdon,updatedon,verifyCode,lastactivity', 'safe'),
    );
}

public function relations() {
    return array(
        'ca' => array(self::HAS_MANY, 'ContactAction', 'contact_id'),               
    );
}

public function search() {

    $criteria = new CDbCriteria;
    $criteria->compare('name', CommonFunctions::escapeOperator($this->name), true, 'OR');
    $criteria->compare('subject', CommonFunctions::escapeOperator($this->subject), true, 'OR');
    $criteria->compare('email', CommonFunctions::escapeOperator($this->email), true, 'OR');
    $criteria->compare('status', CommonFunctions::escapeOperator($this->status), true,'OR');

    $lastactivity_sql = '(select max(date) from tbl_contact_action ca where ca.contact_id=t.contact_id)';
    $criteria->select = array('*', $lastactivity_sql . ' as lastactivity');
    $criteria->addCondition('status<>"Deleted"');
    $criteria->compare($lastactivity_sql, $this->lastactivity);
    $sort = new CSort;
    $sort->defaultOrder = array('lastactivity' => CSort::SORT_DESC); //'title ASC';
    $sort->attributes = array(
        'name' => 'name',
        'email' => 'email',
        'status' => 'status',
        'createdon' => 'createdon',
        'lastactivity' => array(
            'asc' => 'lastactivity ASC',
            'desc' => 'lastactivity DESC',
        ),
    );
    $sort->applyOrder($criteria);
    return new CActiveDataProvider($this, array(
        'criteria' => $criteria,
        'sort' => $sort,
        'pagination' => array(
            'pageSize' => Yii::app()->user->getState('contactPageSize', Yii::app()->params['RECORDPERPAGE_ADMIN']),
            'currentPage' => Yii::app()->user->getState('Contact_page', 0),
        ),
    ));

}
public$verifyCode;
公共活动;
公共静态函数模型($className=\uuuuuuu CLASS\uuuuuuu){
返回父::模型($className);
}
公共函数tableName(){
返回“{contact}}”;
}
公共职能规则(){
返回数组(
数组('name,email,subject,message','required','message'=>Yii::t('app','MSG_ATTRIBUTE_BLANK')),
数组('email','email'),
数组('verifyCode','CaptchaExtendedValidator','allowEmpty'=>!CCaptcha::checkRequirements(),'on'=>'fContact'),
数组('name,email,subject,message,lastactivity','safe','on'=>'search'),
数组('name,subject,email,message,status,createdon,updatedon,verifyCode,lastactivity,'safe'),
);
}
公共职能关系(){
返回数组(
'ca'=>数组(self::有许多,'ContactAction','contactID'),
);
}
公共函数搜索(){
$criteria=新的CDB标准;
$criteria->compare('name',CommonFunctions::escapeOperator($this->name),true,'OR');
$criteria->compare('subject',CommonFunctions::escapeOperator($this->subject),true,'OR');
$criteria->compare('email',CommonFunctions::escapeOperator($this->email),true,'OR');
$criteria->compare('status',CommonFunctions::escapeOperator($this->status),true,'OR');
$lastactivity_sql='(从tbl_contact_action ca中选择最大(日期),其中ca.contact_id=t.contact_id)';
$criteria->select=array('*',$lastactivity\u sql.'as lastactivity');
$criteria->addCondition('状态为“已删除”);
$criteria->compare($lastactivity\u sql,$this->lastactivity);
$sort=新排序;
$sort->defaultOrder=array('lastactivity'=>CSort::sort_DESC);//'title ASC';
$sort->attributes=数组(
“名称”=>“名称”,
“电子邮件”=>“电子邮件”,
“状态”=>“状态”,
“createdon”=>“createdon”,
“lastactivity”=>数组(
'asc'=>'lastactivity asc',
'desc'=>'lastactivity desc',
),
);
$sort->applyOrder($criteria);
返回新的CActiveDataProvider($this,array(
“条件”=>$criteria,
“排序”=>$sort,
“分页”=>数组(
'pageSize'=>Yii::app()->user->getState('contactPageSize',Yii::app()->params['RECORDPERPAGE\u ADMIN']),
“currentPage”=>Yii::app()->user->getState('Contact_page',0),
),
));
}

}

我编辑了我的问题,但条件可能发生了变化,导致显示正确,但排序不起作用。对不起,我从未使用过CSort。如果您不使用csort,并且只保留CActiveDataProvider的条件,会发生什么情况?请查看我的代码以获得帮助我解决此问题的建议…谢谢…好的,您的错误是t.lastactivity不存在,这是正确的。t是当前表的别名,t.lastactivity不存在,因为它是您计算的值。您是否尝试不使用CSort?这行得通吗?好吧,我想这应该教会我如何回答那些我甚至没有因为试图给你一个答案而得到奖励的事情,特别是因为我给你指出了你需要的确切方向。