Yii Cgridview с дублированным именем столбца из реляционных моделей

Я использую Cgridview для отображения результатов для модели "Пользователь" с отношением из модели "UserFlag".

Модель "Пользователь" -> tbl_user (идентификатор, имя, пароль, флаг) Модель "Флаг" -> tbl_userFlag (идентификатор, флаг)

Идентификатор означает то же самое для обеих моделей. Тем не менее, флаги означают по-разному (я не могу изменить базу данных, поэтому должен придерживаться ее), и мне нужно отобразить их в том же виде сетки.

Проблема, с которой я сталкиваюсь, заключается в том, что вид сетки может правильно отображать оба флага, но он не работает и показывает ошибку, когда я пытаюсь отсортировать и отфильтровать флаг из модели "Пользователь". (Однако сортировка и фильтрация прекрасно работают для флага из модели "UserFlag".)

Как я могу решить это?

Журнал ошибок:
CDbCommand failed to prepare the SQL statement: SQLSTATE[HY000]: General error: 1 ambiguous column name: flag.

Модель "Пользователь":

class User extends CActiveRecord
{

public function relations()
{
    return array(
        'FLAG' => array(self::HAS_ONE, 'UserFlag','id'),
    );
}
public function search()
{
    $criteria=new CDbCriteria;
    $criteria->compare('id',$this->id);
    $criteria->compare('name',$this->username,true);
    $criteria->compare('password',$this->password,true);
    $criteria->compare('flag',$this->flag,true);
    $criteria->with = array(
        'FLAG' => array(
                'select' => 'FLAG.flag',
                'together' => true,
        )
    );
    $criteria->compare('FLAG.flag',$this->flagFromB,true);


    return new CActiveDataProvider($this, array(
        'criteria'=>$criteria,
        'sort'=> array(
            'attributes'=>array(
                'flagFromB' => array(
                    'asc' => 'FLAG.flag',
                    'desc' => 'FLAG.flag DESC',
                ),
                '*',
            ),
        ),
    ));
}

Модель "UserFlag":
Ссылка на таблицу tbl_userFlag (id, флаг)

Вид "Пользователь":

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'user-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
        'id',
        'username',
        'password',
        'email',
        'flag',

        array(
            'name' => 'flagFromB',
            'type' => 'raw',
            'value' => '$data->FLAG->flag',
        ),

        array(
            'class'=>'CButtonColumn',
        ),
    ),
));

1 ответ

Вы можете изменить свои модальные отношения.

Модальный файл user.php.

<?php
class User extends CActiveRecord {

    public function relations() {
        return array(
            'FLAG' => array(self::BELONGS_TO, 'UserFlag', 'id'),
        );
    }
    public function search() {
        $criteria = new CDbCriteria;
        $criteria->compare('id', $this->id);
        $criteria->compare('name', $this->username, true);
        $criteria->compare('password', $this->password, true);
        $criteria->compare('flag', $this->flag, true);
        $criteria->with = array(
            'FLAG' => array(
                'select' => 'FLAG.flag',
                'together' => true,
            )
        );
        $criteria->compare('FLAG.flag', $this->flagFromB, true);


        return new CActiveDataProvider($this, array(
            'criteria' => $criteria,
            'sort' => array(
                'attributes' => array(
                    'flagFromB' => array(
                        'asc' => 'FLAG.flag',
                        'desc' => 'FLAG.flag DESC',
                    ),
                    '*',
                ),
            ),
        ));
    }

}
?>

Надеюсь, это поможет.

Другие вопросы по тегам