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()