Yii: реляционный CActiveDataProvider не работает, получена ошибка "Столбец не найден: 1054 Неизвестный столбец"

Я пытаюсь получить данные в стиле CActiveDataProvider для передачи данных в CGridView в соответствующем представлении.

Я пытаюсь получить реляционные данные с помощью CActiveData Provider следующим образом:

  1. У меня есть три таблицы следующим образом:

    СОЗДАТЬ СТОЛ tbl_test_location (locationId int (11) NOT NULL AUTO_INCREMENT, locationName varchar (255) ПО УМОЛЧАНИЮ NULL, ПЕРВИЧНЫЙ КЛЮЧ (locationId)) ENGINE = InnoDB AUTO_INCREMENT = 6 DEFAULT CHARSET =utf8;

    СОЗДАТЬ СТОЛ tbl_test_user (userId int (11) NOT NULL AUTO_INCREMENT, userName varchar (255) ПО УМОЛЧАНИЮ NULL, ПЕРВИЧНЫЙ КЛЮЧ (userId)) ENGINE = InnoDB AUTO_INCREMENT = 3 DEFAULT CHARSET =utf8;

    СОЗДАТЬ СТОЛ tbl_test_location_user_assignment (locationId int (11) NOT NULL, userId int (11) NOT NULL, ПЕРВИЧНЫЙ КЛЮЧ (locationId,userId), КЛЮЧ fk_tlua_user (userId), ОГРАНИЧЕНИЕ fk_tlua_location ИНОСТРАННЫЙ КЛЮЧ (locationId) РЕКОМЕНДАЦИИ tbl_test_location (locationId) НА УДАЛЕННОМ КАСКАДЕ, ОГРАНИЧЕНИЕ fk_tlua_user ИНОСТРАННЫЙ КЛЮЧ (userId) РЕКОМЕНДАЦИИ tbl_test_user (userId) НА УДАЛЕННОМ КАСКАДЕ) ДВИГАТЕЛЬ = CHARSET ПО УМОЛЧАНИЮ InnoDB =utf8;

  2. Отношения в моделях:

/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)'),
  1. Метод в контроллере, называемый actionIndexOwn, имеет следующий вид: Примечание. Пользователь может иметь различные местоположения, и в одном расположении может быть много пользователей.

/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, )); }

  1. и вид:

просмотров /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, но я всегда получаю ту же ошибку...

Большое спасибо за вашу помощь!

2 ответа

Если вы хотите использовать поле реляционных данных, просто используйте имя отношения с именем поля.

$dataProvider=new CActiveDataProvider('TblTestLocation', array(
            'criteria'=>array(
                'with'=>array(
                    'tblTestUsers'=>array(
                        'condition'=>'tblTestUsers.userId=1',
                    ),
                ),
            ),
        ));

Здесь "tblTestUsers" - это имя отношения, определенного в классе модели.

Как вы можете видеть по ошибке, 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,
    ));
}
Другие вопросы по тегам