当我尝试使用CDbCriteria计算记录时,我得到活动记录“酒店”正在尝试选择无效列“count(t。id
)为count
”。
这是我的代码:
$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属性拆分为数组。每次我得到同样的错误。
答案 0 :(得分:2)
只需从别名中删除反引号,计数就可以了。当然,如果您想轻松访问计数,则必须将其声明为类变量,如onkarjanwa所述。
如果你检查错误的来源,就是这个函数:CActiveFinder
的{{3}},计数选择应该满足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
答案 1 :(得分:0)
您需要声明变量$count
,因为Yii不会自动启动非表格列的变量,因此您无法在不声明的情况下使用任何新变量。
你可以通过这样做来解决你的问题。
声明一个模型变量:
class Hotels extends CActiveRecord
{
public $count;
....
}