Я использую Cgridview для отображения результатов для модели «Пользователь» с отношением из модели «UserFlag».
Модель «Пользователь» -> tbl_user (идентификатор, имя, пароль, флаг)
Модель «Флаг» -> tbl_userFlag (id, флаг)
Идентификатор означает то же самое для обеих моделей. Однако флаги означают по-разному (я не могу изменить базу данных, поэтому должен придерживаться ее), и мне нужно отобразить их в том же виде сетки.
Проблема, с которой я сталкиваюсь, заключается в том, что
Вид сетки может отображать оба флага правильно, но он не работает и показывает ошибку, когда я пытаюсь отсортировать и отфильтровать флаг из модели «Пользователь». (Однако сортировка и фильтрация прекрасно работают для флага из модели «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',
),
),
));
Вы можете изменить свои модальные отношения.
Модальный файл 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',
),
'*',
),
),
));
}
}
?>
Надеюсь, это поможет.
Других решений пока нет …