Yii Framework - CGridView сортировать связанные столбцы - PullRequest
2 голосов
/ 20 мая 2011

Заранее спасибо всем, кто может помочь.Я искал ответ, но пока не нашел.Я столкнулся с «решениями», которые не сработали, и которые начинаются с 1 строки и переписывают весь класс.

У меня есть «сетка», чтобы показать отношение, и я могуиспользуйте функцию поиска.То, что я не могу понять, это функция сортировки.Заголовок столбца становится недоступным для щелчка после внесения указанных ниже изменений.

Это то, что у меня есть:

Имя / метка отношения - «компания», настроенная в модели Employee.

Таблица: Employee - Столбец: idCompany & Table:Company - столбец: companyNick

admin.php - ПРОСМОТР

<?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'employee-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
            array(
                    'name'=>'company',   
                    'value'=>'$data->company->companyNick',
            ),
            'lastName',
            'firstName',

ETC...

Employee.php - MODEL

public function search()
    {
            // Warning: Please modify the following code to remove attributes that
            // should not be searched.

            $criteria=new CDbCriteria;

            //Company Relation Search
            $criteria->compare('company.companyNick',$this->company,true);  
            $criteria->with='company'; 

            //stock
            $criteria->compare('idEmployee',$this->idEmployee,true);
            $criteria->compare('idAccount',$this->idAccount,true);

ETC...

Ответы [ 4 ]

5 голосов
/ 24 августа 2011

У меня были те же проблемы, и в конце концов я решил их так:

Метод поиска модели:

$sort = new CSort();
$sort->attributes = array(
'assignedTo'=>array(
    'asc'=>'(SELECT surname from people 
            WHERE people.person_id = t.assigned_to) ASC',       
    'desc'=>'(SELECT surname from people 
            WHERE people.person_id = t.assigned_to) DESC',     
    ),
    '*', // add all of the other columns as sortable   
); 

Просмотр файла:

$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'tasks-grid',
'dataProvider'=>$model->search(),
//'filter'=>$model,
'columns'=>array(
    'task',
    array(
    'header'=>'Assigned To',
    'value'=> '$data->assignedTo->surname.", ".$data->assignedTo->forename',
        'name'=> 'assignedTo',
        'sortable'=>TRUE,
        ),
    'due_date',
    'status',       
),

));

Таким образом, я выбираю отдельное поле из связанной таблицы в предложении order by, а затем упорядочивая по нему, вы создаете объединение таблиц в выражении, в данном случае это - people.person_id = t.assigned_to (где t - это псевдоним таблицы предоставлен yii). Это, пожалуй, не самый эффективный способ создания заказа по предложению, но он работает!

2 голосов
/ 14 декабря 2011

Существует также хорошее объяснение, как это сделать на странице вики-сайта Yii: http://www.yiiframework.com/wiki/281/searching-and-sorting-by-related-model-in-cgridview/

2 голосов
/ 20 мая 2011

Кажется, это ежедневный вопрос о [yii]. Уберите этот материал из вашей функции поиска и добавьте атрибут фильтра в столбец CGridView, например:

        array(
                'name'=>'company',   
                'value'=>'$data->company->companyNick',
                'filter' => CHtml::listData(Company::model()->findAll(),'id','nick'),
        ),
1 голос
/ 30 июня 2013

Мне нравится ответ Майка Х. Я также хочу отметить, что вы могли бы вместо ввода необработанного SQL использовать with () для выполнения реляционного запроса, а затем установить select в false, чтобы предотвратить фактическую загрузку связанных моделей. Вы также можете использовать атрибут атрибута attributeLabel в представлении, передав строку с точечной нотацией, например:


// Controller
$gridDataProvider = new CActiveDataProvider('EmrFormPatientTie', array(
    'criteria'=>array(
        'condition'=>'flag_locked=0',
        'with'=>array('patient'=>array(
            'select'=>false, // Perform relational query without loading related models
        )),
    ),
    'pagination'=>(array('pageSize'=>15)),
    'sort'=>array(
        'attributes'=>array(
            'patient.display_id'=>array(
                'asc'=>'patient.display_id',
                'desc'=>'patient.display_id DESC',
            ),
            '*', // Make all other columns sortable, too
        ),
    ),
));

// View
array(
    'name'=>'patient.display_id',
    'value'=>'$data->patient->display_id',
),

...