условие в критериях в yii framework php

$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
));

Я получаю эту ошибку:

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

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


person iThink    schedule 23.03.2012    source источник


Ответы (2)


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

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

ОБНОВЛЕНИЕ

CActiveDataProvider принимает экземпляр средства поиска, поэтому вам понадобится область действия модели :

<?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());

Надеюсь, это работает

person galymzhan    schedule 23.03.2012
comment
иметь делает работу. Но есть одна проблема с этим. $bizModel->getTotalItemCount() равно 613, что на самом деле является общим количеством записей, игнорирующих фильтр spcount›1. Но в противном случае он показывает отфильтрованные результаты. Потому что я использую Clistview, поэтому это создает проблему в разбиении на страницы. Он показывает разбиение на страницы для 7 страниц, когда в нем всего 7-8 записей. - person iThink; 23.03.2012
comment
@iThink Вы не можете переписать getTotalItemCount, чтобы применить фильтр? - person galymzhan; 23.03.2012
comment
Посмотрите без использования фильтра, т.е. $criteria-›having='spcount›1' getTotalItemCount =163. И использование фильтра getTotalItemCount должно быть 8, потому что он показывает 8 записей, но getTotalItemCount равен 163. - person iThink; 23.03.2012
comment
getTotalItemCount есть что-то вроде SELECT COUNT(*) AS cnt ... ? Не могли бы вы опубликовать SQL, который используется в этом методе - person galymzhan; 23.03.2012
comment
Я думаю, что вы не получили мою последнюю проблему. Фильтрация работает нормально. Но значение getTotalItemCount не является отфильтрованным количеством записей. Может быть, счетчик Yii работает по-другому для наличия. Вот почему для разбиения на страницы clistview я получаю неправильное количество страниц - person iThink; 24.03.2012

Возможно, вы могли бы использовать подвыборочный запрос.

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

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

Или как внутреннее соединение (которое также может содержать условие "where 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 вашего запроса. Кроме того, «группировать по t.id» больше не нужно, так как spcount теперь является единственным значением для каждой строки основной таблицы («t»).

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

person Pimski    schedule 04.04.2012