Вопрос про with и condition в CActiveDataProvider

Приветствую.

Не могу понять, в чём причина ошибки.

Есть три таблицы:

tbl_conv (id, name)

tbl_user (id, name)

tbl_user_conv (id, user_id, conv_id) эта таблица связывает предыдущие по id (Many_Many)

Модель Conv:




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(

			'users'=>array(self::MANY_MANY, 'User',

                'tbl_user_conv(conv_id,user_id)'),

		);

	}



Пытаюсь в контроллере сделать выборку из Conv по конкретному пользователю(id), т.е. хочу выбрать те Conv, по которым существует запись в tbl_user_conv для текущего пользователя:




public function actionConvList()

	{

		$dataProviderConv=new CActiveDataProvider('Conv',

					array(

					'criteria'=>array(

						'with'=>array('users'),

						'condition'=>'users.user_id='.Yii::App()->user->id,

						//'together'=>false,

					),

					'pagination'=>array(

							'pageSize'=>3,

							'pageVar'=>'page2',

						),

					)

				);

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

				'dataProviderConv'=>$dataProviderConv,

			));

	}



Получаю ошибку: CDbCommand failed to execute the SQL statement: SQLSTATE[42S22]: Column not found: 1054 Unknown column ‘users.user_id’ in ‘where clause’

Подскажите, в чём причина ? Как правильно записать условия?

Посмотрите в логах, какой конечный sql-запрос формируется.

вот такой вот запрос в логах:




SELECT COUNT(DISTINCT `t`.`id`) FROM `tbl_conv` `t`  LEFT OUTER JOIN `tbl_user_conv` `users_users` ON (`t`.`id`=`users_users`.`conv_id`) LEFT OUTER JOIN `tbl_user` `users` ON (`users`.`id`=`users_users`.`user_id`)  WHERE (users.conv_id=1)



Такс, похоже разобрался, condition (связка по user_id) засунул в with, а выборку по conv_id оставил в обычном condition

ConvController.php




public function actionConvList()

{

	$conv_id=1;

	$currentuser=Yii::App()->user->id;

	$dataProviderConv=new CActiveDataProvider('Conv',

		array(

			'criteria'=>array(

				'with' => array('users'=>array(

					  'condition'=>'user_id=:user_id ',

					  'params'=>array(':user_id'=>$currentuser),

				)),  

				

				'condition'=>'t.id='.$conv_id,

				//'with'=>array('posts'),

				//'together'=>false,

			),

			'pagination'=>array(

					'pageSize'=>3,

					'pageVar'=>'page2',

			),

		)

	);

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

		'dataProviderConv'=>$dataProviderConv,

	));

}

	



вот бы было где почитать про это, желательно на примерах, а то часто методом научного тыка решения приходится искать :)

В таблице tbl_conv поле id переименуй на conv_id и в tbl_user на user_id соответственно.

А зачем? по идеи все первичные ключи указаны в БД, а связи в моделях.

Я так понял у меня изначально ошибка была в том, что conditon не там указал.

Или есть какой-то другой более красивый/правильнй способ решения задачи:

Алярм алярм… предыдущее решение оказывается работало криво (не фильтровало по user_id).

Нашёл новое решение, на мой взгляд более элегантное:




//This code works fine


public function actionConvList(){

	// в примере я делаю with('users','posts'), а не просто with('users'), т.к. в дальнейшем мне нужна ещё связь с постами <img src='http://www.yiiframework.com/forum/public/style_emoticons/default/smile.gif' class='bbc_emoticon' alt=':)' />

	// conv_id=1 беру для примера (вообще беру из $_GET)

	$conv_id=1; 

	$model = Conv::model()->with('users','posts')->findAll(array(

			'condition'=>'users.id='.Yii::App()->user->id.' AND t.id='.$conv_id,

			'order'=>'t.lastchange DESC',

		));

	$dataProviderConv=new CActiveDataProvider('Conv');

	$dataProviderConv->setData($model);

		

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

		'dataProviderConv'=>$dataProviderConv,

	));

}



Так я и не понял почему возникает ошибка “CDbCommand failed to execute the SQL statement: SQLSTATE[42S22]: Column not found: 1054 Unknown column ‘users.user_id’ in ‘where clause’” если делать вот так:




//This code doesn't work


public function actionConvList(){

	$dataProviderConv=new CActiveDataProvider('Conv',

		array(

			'criteria'=>array(

				'with' => array('users','posts'),

				'condition'=>'t.id=1 AND users.user_id = 1',

				),

			'pagination'=>array(

					'pageSize'=>3,

					'pageVar'=>'page2',

			),

		)

	); 


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

			'dataProviderConv'=>$dataProviderConv,

		)); 


}



по мне дак это почти тоже самое.

попробуй вот так


public function actionConvList()

{

	$dataProviderConv=new CActiveDataProvider('Conv',

		array(

			'criteria'=>array(

				'with'=>array(

					'users'=>array(

						'condition'=>'user_id='.Yii::App()->user->id,

						'together'=>true,

					),

				),

			),

			'pagination'=>array(

				'pageSize'=>3,

				'pageVar'=>'page2',

			),

		)

	);

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

		'dataProviderConv'=>$dataProviderConv,

	));

}

Работает!!! Полтергейст :)

Странно но нигде в документации не видел про то что внутрь with передавать condition (на форму только видел подобный пример)

вод здесь http://www.yiiframework.com/doc/guide/1.1/ru/database.arr#sec-6 например передаются order и together.

Можно догадаться, что массив, в котором они находятся, - конфиг для критерия, т.к. order и together - свойства критерия.