Критерии Yii приносят псевдоним порядка таблицы

#yii

#yii

Вопрос:

У меня есть метод получения полей из связанных таблиц в моей модели Table1:

 public function getFields()
{

    $sort = new CSort();
    $sort->attributes = array('field1','field2');

    $criteria = new CDbCriteria();
    $criteria->select = "t3.xxx as field1, count(t1.id) as field2";
    $criteria->alias = "t1";
    $criteria->join = "inner join Table2 t2 ON t1.id_table2=t2.id";
    $criteria->join .= " inner join Table3 t3 ON t2.id_table3=t3.id";
    $criteria->group = "field1";
    $criteria->order = "field2 desc";

    $dataProvider = new CActiveDataProvider($this, array(
        'criteria'=>$criteria,
        'pagination'=>array('pageSize'=>50,),
            'sort'=>$sort,

    ));
    return $dataProvider;
}
  

В контроллере:

 public function actionListfields()
{
    $dataProvider=Table1::model()->getFields();

    $this->render('index_listfields',array(
            'dataProvider'=>$dataProvider,
    ));
}
  

В полях index_listfields:

 $this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider,
    'columns'=>array(
            'field1',
            'field2',   
        ),
    ));
  

Я получаю сетку с правильными заголовками и 28 строками, это правильный размер моего запроса. Но я не получаю никаких результатов в colmuns. Если я пытаюсь щелкнуть по заголовкам, чтобы «дополнительно» упорядочить столбец, я получаю сообщение об ошибке, в котором говорится странная вещь: в нем говорится, что мой sql пытается использовать псевдоним в команде order внутри sql, например:

 SELECT t3.field as field1, count(t1.id) as field2 FROM "Table1" "t1" inner join Table2 t2 ON t1.id_table2=t2.id inner join Table3 t3 ON t2.id_table3=t3.id GROUP BY field1 ORDER BY "t1"."field2" DESC LIMIT 50
  

Я не знаю, почему предложение order получает префикс t1, но приложение жалуется на это.

Я также не знаю, правильно ли я делаю то, что хочу. Сначала я попытался выполнить это, используя обычный SQL. Я мог бы привести значения полей, но я не мог упорядочить их в gridview.

Я хотел бы получить совет, пожалуйста! Большое спасибо.

Комментарии:

1. Попробуйте добавить свойство в файл Table1 класса как public $field2 . Таким образом, в таблице действительно будет такое поле.

2. Спасибо, Кунал!! Я почти на месте. Включение полей в класс работало для приведения значений. Но порядок все равно не работает! 🙁

3. Пожалуйста, попробуйте мой новый ответ. Теперь все должно работать нормально.

4. Кунал, я понял это! Я решаю проблему, удалив предложение order из критериев: $criterions-> order = «field2 desc»; Я не знаю почему, но это сработало !! 🙂

Ответ №1:

Изменить —

$sort->attributes = array('field1', 'field2');

с

 $sort->attributes = array(
    'field1' => array(
        'asc'=>'field1 ASC',
        'desc'=>'field1 DESC',
    ),
    'field2' => array(
        'asc'=>'field2 ASC',
        'desc'=>'field2 DESC',
    )
);
  

Это работает.

Комментарии:

1. Спасибо за вашу помощь, но это не сработало. Мне пришлось удалить критерии порядка: $criterions-> order = «field2 desc».

Ответ №2:

Я также не знаю, правильно ли я делаю то, что хочу. Сначала я попытался выполнить это, используя обычный SQL. Я мог бы привести значения полей, но я не мог упорядочить их в gridview.

Вероятно, это связано с тем, что SqlDataProvider возвращает массив вместо объекта.