@dro1d

Как сделать сортировку в Yii по данным смежной таблицы?

Есть Yii1. В ней 2 модели Users(id,name,surename) и Contacts(id,phone,email). Связь между моделями 1 к 1.
Есть страница с CGridView куда выводятся данные: Users.id, Users.name, Users.surename, Contacnts.phone, Contacts.email.
По полям телефона и имейла необходимо сделать фильтрацию и сортировку как у других полей. Фильтрацию я сделал, а с сортировкой беда.
Вот контроллер:
public function actionAdmin()
	{
		$model=new Users('search');
		$model->unsetAttributes();  // clear any default values
		if(isset($_GET['Users']))
			$model->attributes=$_GET['Users'];

		$this->render('admin',array(
			'model'=>$model,
		));
	}

Вот модель:
*/
	public function search()
	{
		// @todo Please modify the following code to remove attributes that should not be searched.

		$criteria=new CDbCriteria;

		$criteria->compare('id',$this->id);
		$criteria->compare('name',$this->name,true);
		$criteria->compare('surename',$this->surename,true);

		if ($this->phone){
		  $criteria->with[] = 'contacts';
		  $criteria->compare('contacts.phone', $this->phone,true); 
		}

		if ($this->email){
		  $criteria->with[] = 'contacts';
		  $criteria->compare('contacts.email', $this->email,true);
		}

		$sort = new CSort;
		$sort->attributes= array(
			'contacts.email'=>array(
				'defaultOrder'=>'contacts.email asc',
				'desc'=>'contacts.email DESC'),
			'contacts.phone',
			'*',
			);

		return new CActiveDataProvider(get_class($this), array(
			'criteria'=>$criteria,
			'sort'=>$sort,
		));
	}


Вот вьюшка:

<?php $this->widget('zii.widgets.grid.CGridView', array(
	'id'=>'users-grid',
	'dataProvider'=>$model->search(),
	'filter'=>$model,
	'columns'=>array(
		'id',
		'name',
		'surename',
		
		'email'=>array( 
			'header'=>'Email',
			'value'=>'$data->contacts->email',
			'filter'=>CHtml::activeTextField($model,'email')	
		),
		'contacts.phone'=>array( 
			'header'=>'Phone',
			'value'=>'$data->contacts->phone',
			'filter'=>CHtml::activeTextField($model,'phone')	
		),
		array(
			'class'=>'CButtonColumn',
		),
	),
)); ?>

Перерыл все форумы, не могу сделать сортировку по имейлу и телефону. Спасибо.
  • Вопрос задан
  • 189 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Cage
Попробуй так:
1.
$criteria->with[] = 'contacts';
вынести из под условий
2. сюда
'contacts.phone'=>array( 
      'header'=>'Phone',
      'value'=>'$data->contacts->phone',
      'filter'=>CHtml::activeTextField($model,'phone')	
    ),

добавить
'name'=>'contacts.phone',
3. Настройки для CDataProvider удобнее использовать так:
return new CActiveDataProvider(get_class($this), array(
            'criteria'=>$criteria,
            'sort'=>[
                'defaultOrder' => 'contacts.email ASC',
                'attributes' => [
                    'contacts.phone' => [
                        'asc' => 'contacts.phone ASC',
                        'desc' => 'contacts.phone DESC'
                    ],
                    'contacts.email' => [
                        'asc' => 'contacts.email ASC',
                        'desc' => 'contacts.email DESC'
                    ],
                    '*'
                ]
            ],
        ));
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы