2012-03-23 2 views
2
$criteria=new CDbCriteria(); 
$criteria->with = array('reviewCount', 'category10', 'category20', 'category30', 'town'); 
$criteria->select = 't.id,business,street,postalCode,contactNo,checkinCount,count(tbl_abc.id) as spcount'; 
$criteria->join = 'left join tbl_abc on t.id=tbl_abc.businessId'; 
$criteria->group = 't.id'; 
$criteria->order = 'spcount DESC'; 
$criteria->condition='spcount>1'; 
$bizModel = new CActiveDataProvider(Business::model(), array(
    'criteria' => $criteria 
)); 

Я получаю эту ошибку:условия критериев в рамках Yii PHP

Column not found: 1054 Unknown column 'spcount' in 'where clause'

Если я опустить условие запроса отлично работает & заказов предприятий по spcount. Итак, как мне переписать этот запрос таким образом, чтобы получить все предприятия, чья spcount больше 1?

ответ

2

Насколько я знаю, вы не можете ссылаться на псевдонимы в части WHERE (proof link). Удалите строку состояния и добавьте следующее:

$criteria->having = 'COUNT(tbl_abc.id) > 1'; 

UPDATE

CActiveDataProvider accepts finder instance, так что вы будете нуждаться в модель сфере:

<?php 
class Business extends CActiveRecord 
{ 
    public function scopes() 
    { 
    return array(
     'hasSpcount' => array(
     'with' => array('reviewCount', 'category10', 'category20', 'category30', 'town'), 
     'select' => 't.id,business,street,postalCode,contactNo,checkinCount,count(tbl_abc.id) as spcount', 
     'join' => 'left join tbl_abc on t.id=tbl_abc.businessId', 
     'group' => 't.id', 
     'order' => 'spcount DESC', 
     'having' => 'COUNT(tbl_abc.id) > 1', 
    ), 
    ); 
    } 
} 

// usage 
$provider = new CActiveDataProvider(Business::model()->hasSpcount()); 

Надеется, что это работаешь

+0

having выполняет работу. Но есть одна проблема с этим. $ bizModel-> getTotalItemCount() равен 613, что на самом деле является общим числом записей, игнорирующих фильтр spcount> 1. Но в противном случае это показывает отфильтрованные результаты. Потому что Im использует Clistview, поэтому он создает проблему в разбиении на страницы. Его показ разбиения на страницы для 7 страниц, когда у него всего 7-8 записей. – iThink

+0

@iThink Вы не можете переписать 'getTotalItemCount' для применения фильтра? – galymzhan

+0

Посмотрите без использования фильтра i.e $ criteria-> having = 'spcount> 1' getTotalItemCount = 163. И использование фильтра getTotalItemCount должно быть 8, потому что его показ 8 записей, но getTotalItemCount равен 163 – iThink

0

Может быть, вы может использовать суб-выбор-запрос.

Например, в избранной части вас критерии объекта:

$criteria->select = 't.id,business,street,postalCode,contactNo,checkinCount,(select count(id) from tbl_abc where t.id=businessId) as spcount'; 

Или, как внутреннее соединение (которое также может содержать "где spcount> 1" состояние):

$criteria->join = 'join (select businessId, count(*) as spcount from tbl_abc) abc on t.id=abc.businessId and abc.spcount>1'; 

В оба сценария spcount также доступны в where-clause вашего запроса. Кроме того, «group by t.id» больше не требуется, поскольку spcount теперь является единственным значением для каждой строки основной таблицы («t»).

Надеюсь, что это поможет