CActiveDataProvider drops 'with' clause of provided CDbCriteria

Hi all,

I have a model ‘File’ with a many-many relationschip with the model ‘User’.

The many-many relationship represents which users may see which files.

I want a list of all files a particular user may see. I use this criteria:


$criteriaCors=new CDbCriteria(array(

	    'with'=>array(

		'accessUsers'=>array(

		'alias'=>'us',

		),

	    ),

	));

$criteriaCors->compare('us.id',1/*Yii::app()->user->getId()*/);

If I use


$data = File::model()->findAll($criteriaCors);



to retrieve the files, all is well.

However, I want to use a CActiveDataProvider (to be used by a zii.widgets.CListView in the view).

When I use a CActiveDataProvider like this:


$dataProviderCors=new CActiveDataProvider('File', array(

    'criteria'=>$criteriaCors,

));

$data = $dataProviderCors->getData();

I get an error:


CDbCommand failed to execute the SQL statement: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'us.id' in 'where clause'

This is because the JOIN resulting form the ‘with criteria’ is not present in the generated SQL.

I don’t know where the problems originates, but it seems a ‘CJoinElement’ is created which ignores the ‘with’ part of the criteria?

Does anybody knows if this is a bug?

And/or how to solve the problem?

Thanks,

Nico

Complete error stacktrace:


#0 /var/www/yii/framework/db/CDbCommand.php(351): CDbCommand->queryInternal('fetchAll', 2, Array)

#1 /var/www/yii/framework/db/ar/CActiveFinder.php(743): CDbCommand->queryAll()

#2 /var/www/yii/framework/db/ar/CActiveFinder.php(401): CJoinElement->runQuery(Object(CJoinQuery))

#3 /var/www/yii/framework/db/ar/CActiveFinder.php(72): CJoinElement->find(Object(CDbCriteria))

#4 /var/www/yii/framework/db/ar/CActiveRecord.php(1244): CActiveFinder->query(Object(CDbCriteria), true)

#5 /var/www/yii/framework/db/ar/CActiveRecord.php(1326): CActiveRecord->query(Object(CDbCriteria), true)

#6 /var/www/yii/framework/web/CActiveDataProvider.php(123): CActiveRecord->findAll(Object(CDbCriteria))

#7 /var/www/yii/framework/web/CDataProvider.php(120): CActiveDataProvider->fetchData()

#8 /var/www/yii/framework/zii/widgets/CBaseListView.php(105): CDataProvider->getData()

#9 /var/www/yii/framework/zii/widgets/CListView.php(156): CBaseListView->init()

#10 /var/www/yii/framework/web/CBaseController.php(140): CListView->init()

#11 /var/www/yii/framework/web/CBaseController.php(165): CBaseController->createWidget('zii.widgets.CLi...', Array)

#12 /var/www/corsfilemanager/protected/views/file/indexCors.php(16): CBaseController->widget('zii.widgets.CLi...', Array)

#13 /var/www/yii/framework/web/CBaseController.php(119): require('/var/www/corsfi...')

#14 /var/www/yii/framework/web/CBaseController.php(88): CBaseController->renderInternal('/var/www/corsfi...', Array, true)

#15 /var/www/yii/framework/web/CController.php(798): CBaseController->renderFile('/var/www/corsfi...', Array, true)

#16 /var/www/corsfilemanager/protected/views/site/index.php(3): CController->renderPartial('../file/indexCo...', Array)

#17 /var/www/yii/framework/web/CBaseController.php(119): require('/var/www/corsfi...')

#18 /var/www/yii/framework/web/CBaseController.php(88): CBaseController->renderInternal('/var/www/corsfi...', Array, true)

#19 /var/www/yii/framework/web/CController.php(798): CBaseController->renderFile('/var/www/corsfi...', Array, true)

#20 /var/www/yii/framework/web/CController.php(739): CController->renderPartial('index', Array, true)

#21 /var/www/corsfilemanager/protected/controllers/SiteController.php(60): CController->render('index', Array)

#22 /var/www/yii/framework/web/actions/CInlineAction.php(32): SiteController->actionIndex()

#23 /var/www/yii/framework/web/CController.php(300): CInlineAction->run()

#24 /var/www/yii/framework/web/CController.php(278): CController->runAction(Object(CInlineAction))

#25 /var/www/yii/framework/web/CController.php(257): CController->runActionWithFilters(Object(CInlineAction), Array)

#26 /var/www/yii/framework/web/CWebApplication.php(324): CController->run('')

#27 /var/www/yii/framework/web/CWebApplication.php(121): CWebApplication->runController('')

#28 /var/www/yii/framework/base/CApplication.php(135): CWebApplication->processRequest()

#29 /var/www/corsfilemanager/index.php(13): CApplication->run()



It seems the problem does not occur when ‘together’ is set to true:


$criteriaCors=new CDbCriteria(array(

	    'with'=>array(

		'accessUsers'=>array(

		'alias'=>'us',

		'together'=>true

		),

	    ),

	));

See This forum post

But it is not clear to me why.

It’s related with the model relations

You will find the appropriate solution on following

http://www.yiiframework.com/forum/index.php?/topic/16190-property-is-not-defined/

http://www.yiiframework.com/doc/guide/1.1/en/database.arr