Вы можете быть заинтересованы в том, что предлагается here
Посмотрите также ссылки на посты как this one
Но, в любом случае, у меня была такая же проблема, как хорошо, и мой желаемый обходной путь был один которые предлагают рабочее решение с низкой стоимостью кода. Конечно, мышление об этом требует времени, но результат лучше, чем просто попробовать вещи, которые не ожидаются.
В моем случае представление дало сценарию чтения некоторые новые атрибуты, которые должны были быть удалены в окне «Обновить» или «Вставить» (сценарии). Проблема заключалась в том, что процесс валидации, когда до базовых классов (CActiveRecord/CModel) требует наличия сценария чтения. Это означает переписывание полных методов проверки или одновременное использование двух сценариев.
Мое решение состоит в том, чтобы сохранить сценарий чтения как можно дольше, а затем изменить контекст, когда в реальности мы собираемся написать некоторые данные.
// At init time, it is supposed that read scenario reigns
public function init(){
$this->_tableName = 'view_name';
}
...
// Cause I found no other solution as well,
// this is my way for avoiding Yii _md private scope
protected function setMetaDataForWriting(){
$this->_tableName = 'table_name';
$this->getMetaData()->tableSchema->name = $this->_tableName;
$this->getMetaData()->tableSchema->rawName = $this->_tableName;
$columns = &$this->getMetaData()->tableSchema->columns;
$this->getMetaData()->tableSchema->columns = array_diff_key($columns,
array_flip(array('View_Added_Field1',
'View_Added_Field2',
..,
'View_Added_FieldN')));
}
// Ensure that a field for acting like primary key is present in your SQL View
public function primaryKey()
{
return 'id';
}
public function beforeSave(){
$this->setMetaDataForWriting();
return parent::beforeSave();
}
public function afterSave(){
$this->_tableName = 'view_name';
$this->refreshMetaData();
return parent::afterSave();
}
Можете ли вы уточнить, пожалуйста? – FabioCosta