繁体   English   中英

如何在yii的cdbCriteria中使用SUM?

[英]How to use SUM in cdbCriteria in yii?

我有这个代码,它显示了所有每日退订用户..

public function getdailyUnSubs($modelName,$op){

    $currentDate = date('Ymd');
    $criteria = new CDbCriteria;
    $criteria->select = 'app_unsubs,sms_unsubs';

    $criteria->order = 'date DESC';
    $criteria->limit = 1;
    $criteria->offset = 0;
    $Subscriber = $modelName::model()->find($criteria);

    $totalunSubs = $Subscriber['app_unsubs']+$Subscriber['sms_unsubs'];

    return $totalunSubs;
}

但是现在我想获得到目前为止所有未订阅的用户。 我想要所有未订阅用户的总和。

这是我的代码,但它不起作用。

public function getTotalUnSubs($modelName,$op){


    $criteria = new CDbCriteria;
    $criteria->select ='sum(app_unsubs) as appunsubs, sum(sms_unsubs) as smsunsubs';

    $Subscriber = $modelName::model()->find($criteria);

    $totalunSubs = $Subscriber['appunsubs']+$Subscriber['smsunsubs'];

    return $totalunSubs;
}

它说appunsubssmsunsubs没有定义。

即使我将代码更改为

$criteria->select ='(sum(app_unsubs)+ sum(sms_unsubs)) as totalunsubs';

$totalunSubs = $Subscriber['totalunsubs'];

它仍然说totalunsubs是未定义的。

您有未定义的appunsubssmsunsubs因为$modelName模型类中没有类似的字段。 要获取数据,您可以根据条件创建查询并使用Yii::app()->db->createCommand($sql)->queryRow()执行此查询。 看看这个代码:

public function getTotalUnSubs($modelName,$op)
{
    $criteria = new CDbCriteria;
    $criteria->select ='sum(app_unsubs) as appunsubs, sum(sms_unsubs) as smsunsubs';

    //creating proper SQL
    $sql = Yii::app()->db->commandBuilder->createFindCommand($modelName, $criteria)->getText();

    //fetching data based on created SQL stored in $sql variable
    $Subscriber = Yii::app()->db->createCommand($sql)->queryRow();

    $totalunSubs = $Subscriber['appunsubs']+$Subscriber['smsunsubs'];

    return $totalunSubs;
}

我认为您必须将Group By设置为您的查询。

所以代码现在是这样的。

public function getTotalUnSubs($modelName,$op){


    $criteria = new CDbCriteria;
    $criteria->select ='sum(app_unsubs) as appunsubs, sum(sms_unsubs) as smsunsubs';
    $criteria->group='table primary key';

    $Subscriber = $modelName::model()->find($criteria);

    $totalunSubs = $Subscriber['appunsubs']+$Subscriber['smsunsubs'];

    return $totalunSubs;
}

简单的解决方案是将公共或受保护的变量名称作为 sum 添加到模型中。 我建议使用它,因为我称之为“子模型”......

class Summary extends CActiveRecord {
   public $total;
}

class Item extends Summary {
   ...
}

然后您可以在标准中自由使用计数或总和,它们将在使用 find、findAll 等检索的模型中显示为变量。

$criteria = new CDbCriteria();
$criteria->select = "count(id) as total,type,lang,source";
$criteria->group = "lang,source,type"; 
$result = Item::model()->findAll($criteria);

结果是:(例如)

array(1) {
  [0]=>
  object(Item)#48 (12) {
    ["total"]=>
    string(2) "50"

这些子模型非常适合将您的函数、关系和其他东西保留在那里,就好像该类需要从 Gii 自动生成一样,您只需要将 extends CActiveRecord 替换为 extends SubmodelName...

此外,这些年来,我开发了 Base(模型),设置了我一般需要的一切(user_id 到登录用户,检查日期格式是否正确等)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM