Я пытаюсь получить данные в стиле CActiveDataProvider для передачи данных в CGridView в соответствующем представлении.
Я пытаюсь получить реляционные данные с помощью CActiveData Provider следующим образом:
У меня есть три таблицы следующим образом:
СОЗДАТЬ СТОЛ tbl_test_location
(
locationId
int (11) NOT NULL AUTO_INCREMENT,
locationName
varchar (255) DEFAULT NULL,
ОСНОВНОЙ КЛЮЧ (locationId
)
) ENGINE = InnoDB AUTO_INCREMENT = 6 DEFAULT CHARSET = utf8;
СОЗДАТЬ СТОЛ tbl_test_user
(
userId
int (11) NOT NULL AUTO_INCREMENT,
userName
varchar (255) DEFAULT NULL,
ОСНОВНОЙ КЛЮЧ (userId
)
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARSET ПО УМОЛЧАНИЮ = utf8;
СОЗДАТЬ СТОЛ tbl_test_location_user_assignment
(
locationId
int (11) NOT NULL,
userId
int (11) NOT NULL,
ОСНОВНОЙ КЛЮЧ (locationId
,userId
),
KEY fk_tlua_user
(userId
),
CONSTRAINT fk_tlua_location
ИНОСТРАННЫЙ КЛЮЧ (locationId
) РЕКОМЕНДАЦИИ tbl_test_location
(locationId
) НА УДАЛЕННОМ КАСКАДЕ,
CONSTRAINT fk_tlua_user
ИНОСТРАННЫЙ КЛЮЧ (userId
) РЕКОМЕНДАЦИИ tbl_test_user
(userId
) НА УДАЛЕННОМ КАСКАДЕ
) ENGINE = InnoDB CHARSET ПО УМОЛЧАНИЮ = utf8;
Отношения в моделях:
/models/TestLocation.php
'tblTestUsers' => array(self::MANY_MANY, 'TestUser', '{{test_location_user_assignment}}(locationId, userId)'),
/models/TestUser.php
'tblTestLocations' => array(self::MANY_MANY, 'TestLocation', '{{test_location_user_assignment}}(userId, locationId)'),
/controllers/TestLocationController.php
public function actionIndexOwn()
{
$dataProvider=new CActiveDataProvider('TestLocation', array(
'criteria'=>array(
'with'=>array(
'tblTestUsers'=>array(
'condition'=>'tbl_test_user.userId=1',
),
),
),
));
$this->render('index',array(
'dataProvider'=>$dataProvider,
));
}
просмотров / testLocation / index.php
<?php $this->widget('zii.widgets.CListView', array(
'dataProvider'=>$dataProvider,
'itemView'=>'_view',
)); ?>
Я получил эту ошибку:
CDbCommand failed to execute the SQL statement: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'tbl_test_user.userId' in 'where clause'. The SQL statement executed was: SELECT COUNT(DISTINCT `t`.`locationId`) FROM `tbl_test_location` `t` LEFT OUTER JOIN `tbl_test_location_user_assignment` `tblTestUsers_tblTestUsers` ON (`t`.`locationId`=`tblTestUsers_tblTestUsers`.`locationId`) LEFT OUTER JOIN `tbl_test_user` `tblTestUsers` ON (`tblTestUsers`.`userId`=`tblTestUsers_tblTestUsers`.`userId`) WHERE (tbl_test_user.userId=1)
Журнал приложения:
CDbCommand::fetchColumn() failed: SQLSTATE[42S22]: Column not found: 1054
Unknown column 'tbl_test_user.userId' in 'where clause'. The SQL statement
executed was: SELECT COUNT(DISTINCT `t`.`locationId`) FROM
`tbl_test_location` `t` LEFT OUTER JOIN
`tbl_test_location_user_assignment` `tblTestUsers_tblTestUsers` ON
(`t`.`locationId`=`tblTestUsers_tblTestUsers`.`locationId`) LEFT OUTER JOIN
`tbl_test_user` `tblTestUsers` ON
(`tblTestUsers`.`userId`=`tblTestUsers_tblTestUsers`.`userId`) WHERE
(tbl_test_user.userId=1).
in C:\htdocs\RackDomain\protected\views\testLocation\index.php (20)
in C:\htdocs\RackDomain\protected\controllers\TestLocationController.php
(147)
Может кто-нибудь помочь мне, я пробую много способов написать реляционный CActiveDataProvider, но я всегда получаю ту же ошибку …
Большое спасибо за вашу помощь!
Как вы можете видеть по ошибке, Yii использует псевдонимы для имен таблиц в своих SQL-запросах. Таким образом, вы должны использовать этот псевдоним тоже. Что еще положить имена таблиц, имена столбцов и псевдонимы в ``
менее подвержен ошибкам.
Ваш код должен выглядеть так:
public function actionIndexOwn()
{
$dataProvider=new CActiveDataProvider('TestLocation', array(
'criteria'=>array(
'with'=>array(
'tblTestUsers'=>array(
'condition'=>'`tblTestUsers`.`userId`=1',
),
),
),
));
$this->render('index',array(
'dataProvider'=>$dataProvider,
));
}
Если вы хотите использовать поле реляционных данных, просто используйте имя отношения с именем поля.
$dataProvider=new CActiveDataProvider('TblTestLocation', array(
'criteria'=>array(
'with'=>array(
'tblTestUsers'=>array(
'condition'=>'tblTestUsers.userId=1',
),
),
),
));
Вот «tblTestUsers» это имя отношения, определенного в классе модели.