2012-06-14 4 views
0

В Yii, может ли моя модель читать из представления базы данных, пока она создает, обновляет и удаляет, все еще идет в базовую таблицу?В Yii, может ли моя модель читать из представления базы данных, пока создает, обновляет и удаляет все еще, перейдите в базовую таблицу?

В принципе, любые операторы SELECT, которые я хочу направлять в конкретный вид базы данных (возможно, с некоторыми дополнительными столбцами агрегата или для принудительного чтения).

Возможно ли это, и как это можно сделать?

+0

Можете ли вы уточнить, пожалуйста? – FabioCosta

ответ

0

Насколько я знаю, это невозможно. Вы можете использовать Query Builder, но вы потеряете все модели capabilites: http://www.yiiframework.com/doc/guide/1.1/en/database.query-builder

Я спросил на форумах, если есть возможность определить для Yii 2 способа установки, как все дБ операций выполняются в CRUD модели. Например, чтобы использовать хранимые процедуры вместо стандартного, выберите select, вставьте update delete.

0

Вы сможете создавать или создавать модели представлений базы данных, как и для таблицы. Просто используйте имя представления вместо имени таблицы. Поэтому, когда вы хотите просмотреть результаты, просто вызовите модель представления базы данных, и когда вы хотите отредактировать вызов модели таблицы.

2

Вы можете быть заинтересованы в том, что предлагается 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(); 
}