【问题标题】:Hard time counting records using CDbCriteria使用 CDbCriteria 计算记录的困难时间
【发布时间】:2012-10-11 21:42:26
【问题描述】:

当我尝试使用 CDbCriteria 计算记录时,我得到 活动记录“Hotels”正在尝试选择无效列“count(t.id) as count”。 p>

这是我的代码:

$criteria = new CDbCriteria();
        $criteria->select = 'count(t.id) as `count`, t.`keywords`, min(offers.first_bookin) as first_bookin';
        $criteria->with = array('offers');
        $criteria->group = 'offers.hotels_id';
        $criteria->compare('first_bookin','>' . date('Y-m-d'));
        $criteria->together = true;

        $hotelItems = Hotels::model()->findAll($criteria);

这是我在酒店模型中定义的关系:

return array(
            'headers' => array(self::HAS_MANY, 'Headers', 'hotels_id'),
            'offers' => array(self::HAS_MANY, 'Offers', 'hotels_id'),
        );

我在这里和其他一些网站上发了很多帖子,但似乎没有任何效果。我尝试使用 count(*)、count(id),我尝试将 select 属性拆分为一个数组。每次我得到同样的错误。

【问题讨论】:

  • 谢谢大家。它没有反引号

标签: yii count criteria


【解决方案1】:

只需从别名中删除 反引号,计数即可。当然,如果您想轻松访问计数,则必须将其声明为类变量,如 onkarjanwa 所述。

如果你检查错误的来源,是这个函数:getColumnSelectCActiveFinder,select for count应该满足这一行,在getColumnSelect

elseif(preg_match('/^(.*?)\s+AS\s+(\w+)$/im',$name,$matches)) // if the column is already aliased

但由于别名中的反引号,它不匹配,并引发错误。所以你的select 应该没有别名的反引号:

$criteria->select = 'count(t.id) as count, t.`keywords`, min(offers.first_bookin) as first_bookin';

当我测试这个时,我在你的compare 中遇到了另一个错误,所以你应该把它改成:

$criteria->compare('offers.first_bookin','>' . date('Y-m-d')); // can't use the alias in where clause

【讨论】:

    【解决方案2】:

    你需要声明一个变量$count,因为Yii不会自动启动不是表列的变量,所以你不能在没有声明的情况下使用任何新变量。

    你可以通过这样做来解决你的问题。

    声明一个模型变量:

    class Hotels extends CActiveRecord
    {
        public $count;
        ....
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多