#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 возвращает массив вместо объекта.