Grid, фильтрация, MANY_MANY

Задача, есть таблица продуктов, категорий и связей между ними.

1 продукт может находится в разных категориях.

получается связь между продуктами и категориями MANY_MANY

вывожу все это дело в гриде. естественно без какой-либо группировки по категориями

сплошной список продуктов, в колонке категорий вывожу список категорий в которых находится продукт, просто через запятую.

но в этой колонке я хочу приделать фильтр по категориям

сам фильтр отображается, все корректно передает

но вот момент как фильтровать по такому полю пока проходит мимо меня.

в квартире 38 градусов и мозг немного начинает подтекать.

подскажите куда копать ? а то что-то не пойму в какую сторону мне идти

фильтрация происходит в экшене примерно по такому принципу




		$model = new products('search');

		if(isset($_GET['products'])) {

			if(!empty($_GET['products']['products_id'])) $model->products_id = $_GET['products']['products_id'];

			if(!empty($_GET['products']['products_name'])) $model->products_name = $_GET['products']['products_name'];

			if(!empty($_GET['products']['products_model'])) $model->products_model = $_GET['products']['products_model'];

			if(!empty($_GET['products']['categories_id'])) $model->categories_id = $_GET['products']['categories_id'];

			if(!empty($_GET['products']['manufacturers_id'])) $model->manufacturers_id = $_GET['products']['manufacturers_id'];

		}


		$criteria = new CDbCriteria;

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

		

		$sort = new CSort('pages');

		$sort->defaultOrder = 't.products_name asc';


		$dataProvider = new CActiveDataProvider('products', array(

			'criteria' => $criteria,

			'sort' => $sort,

			'pagination' => array(

				'pageSize' => Yii::app()->params['perPage'],

			),

		));	

		

		if(!empty($model->products_id)) $dataProvider->criteria->compare('t.products_id', $model->products_id);

		if(!empty($model->products_name)) $dataProvider->criteria->addSearchCondition('t.products_name', '%' . $model->products_name . '%', false);

		if(!empty($model->products_model)) $dataProvider->criteria->addSearchCondition('t.products_model', '%' . $model->products_model . '%', false);

		if(!empty($model->manufacturers_id)) $dataProvider->criteria->compare('t.manufacturers_id', $model->manufacturers_id);




У меня задача немного попроще, один ко многим, но в гриде никак не могу вывести значения,

пробовал


'value'=> $model->type->name,

но получаю ошибку "Trying to get property of non-object"

выводядтя почему-то только ID-шки


'value'=> $model->type_id,




<?php $this->widget('zii.widgets.grid.CGridView', array(

	'id'=>'properties-grid',

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

	'filter'=>$model,

	'columns'=>array(

		'id',

		'title',

		'state.name',

		'city',

		array(

			'name'=>'type_id',

			'value'=> $model->type_id,

			'filter'=> CHtml::listData(Types::model()->findAll(), 'id', 'name'),

		),

		'price',

		array(

			'class'=>'CButtonColumn',

		),

	),

)); ?>



так вот из-за этого


'value'=> $model->type_id,

и выводятся

вам надо джоин сделать и вывести значение вместо ID

Так у меня есть в модели




public function relations()

	{

		// NOTE: you may need to adjust the relation name and the related

		// class name for the relations automatically generated below.

		return array(

			'state' => array(self::BELONGS_TO, 'States', 'state_id'),

			'type' => array(self::BELONGS_TO, 'Types', 'type_id'),

		);

	}



В других местах нормально используется




$model->state->name;

или

$model->type->name;



И даже вот тут имя района нормально выводится когда написано через точку state.name




'columns'=>array(

                'id',

                'title',

                'state.name',

                'city',

...



поставьте себе XWebDebugRouter и смотрите какие запросы генерируются

я с помощью этой штуки отлавливаю свои баги )

там будет видно что за запрос генерируется.

Оказалось что надо в кавычках брать и использовать через $data




                array(

			'name'=>'type_id',

			'value'=>'$data->type->name',

			'filter'=> CHtml::listData(Types::model()->findAll(), 'id', 'name'),

		),



ну таки да )

не обратил внимание

Удалил. Не заметил решения

Блин, нашел решение. Тупил немного )

$model->categories_id используется ведь только для самого поля фильтра.

а если $model->categories_id не пустой, то я просто расширяю критерию, которая передается в CActiveDataProvider

Пример кода в студию

Вот эта часть из кода




                $criteria = new CDbCriteria;

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



меняется на




                $criteria = new CDbCriteria;

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

		if(!empty($model->categories_id)) {

			$criteria->condition = 't.id in ( select products_id from products_to_categories where categories_id = :categories_id)';

			$criteria->params = array(':categories_id' => $model->categories_id);

		}