Сортировка Связанных Моделей

Доброй ночи. Надеюсь на Вашу помощь.

Есть модель Order, у которой есть relation orderItems (HAS_MANY).

Во view делаю вывод данных модели Ордер, а ниже с помощью CGridView вывод данных всех связанных OrderItems.

Нужно сделать сортировку этих самых OrderItems по их полям, но чето никак не могу допереть как (уже 2-й час ночи).

Код такой:


class Order extends CActiveRecord{

   ...

   	public function rules()

	{

		return array(

			...

			array('id, status_id, updated_date, orderItems', 'safe', 'on'=>'search'),

		);

	}

   ...

        public function relations()

	{

	        return array(

                    'orderItems' => array(self::HAS_MANY, 'OrderItem', array('order_id'=>'id')),

		);

	}

   ...

        public function search()

	{

		$criteria=new CDbCriteria;

                $criteria->with = array('orderItems');

        

		return new CActiveDataProvider($this, array(

			'criteria'=>$criteria,

                        'sort'=>array(

                            'attributes'=>array(

                                 'orderItems'=>array(

                                     'asc'=>'orderItems.prod_id',

                                     'desc'=>'orderItems.prod_id DESC',

                                 ),

                            ),

                        ),

		));

	}

}


class OrderController extends Controller{

    ...

        public function actionView($id)

	{

            $order=new Order('search');

            $model=$order->with("orderItems")->findByPk($id);

	    $this->render('view',array(

		    'model'=>$model,

	    ));

	}

    ...

}



view.php:


...

$this->widget('bootstrap.widgets.TbDetailView', array(

    'data'=>$model,

    'attributes'=>array(

        array('name'=>'id', 'label'=>'ID'),

        array('name'=>'status.name', 'label'=>'Status'),

        array('name'=>'updated_date', 'label'=>'Updated'),

        array('name'=>'created_date', 'label'=>'Created'),

    ),

));


$columns = array(

	array(

		'name'=>'id',

		'header'=>'Item ID',

		'type'=>'raw',

	),

        array(

		'name'=>'prod_id',

		'header'=>'Product',

		'type'=>'raw',

	),

};


$dataProvider=new CActiveDataProvider('OrderItem', array('data'=>$model->orderItems));


$this->widget('bootstrap.widgets.TbGridView', array(

	'dataProvider'=>$dataProvider,

	'template'=>'{items}',

	'emptyText'=>'',

	'columns'=>$columns,

));

Линк сортировки в табличке получается вот такой: index.php?r=order/view&id=2&OrderItem_sort=prod_id&ajax=yw1

Но сортировать табличку никак не получаеться.

Помогите.

Почитай тут. http://www.yiiframework.com/wiki/281/searching-and-sorting-by-related-model-in-cgridview/ Как раз по твоей теме. Мне она в свое время помогла

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

Проблему решил.

Что изменил по сравнению с представленным кодом:

  1. Убрал из ‘safe’, ‘on’=>‘search’ relation orderItems

  2. Убрал из search: $criteria->with = array(‘orderItems’); и элемент sort из new CActiveDataProvider

  3. Метод actionView вернул как было


public function actionView($id)

	{

        $model=$this->loadModel($id);

		$this->render('view',array(

			'model'=>$model,

		));

	}

Это были изменения которые не нужно было делать.

Теперь изменения которые решили задачу:

  1. В serch модели OrderItem добавил входящий параметр $orderID и $criteria->compare(‘order_id’,$orderID);

  2. Во view модели Order в CGridView в качестве датапровайдера передаю:


$items=new OrderItem("search");

$this->widget('bootstrap.widgets.TbGridView', array(

	'dataProvider'=>$items->search($model->id),

...

, где $model->id - и есть ID ордера.