2012-06-14 6 views
0

Yii에서 모델을 만들고, 업데이트하고, 삭제하는 동안 여전히 기본 테이블로 이동하면서 데이터베이스 뷰에서 모델을 읽을 수 있습니까?Yii에서 모델을 생성, 업데이트 및 삭제하는 동안 데이터베이스 뷰에서 읽을 수 있습니까? 여전히 기본 테이블로 이동합니까?

기본적으로 모든 SELECT 문 특정 데이터베이스 뷰 (일부 추가 집계 열 또는 더티 읽기를 강요하는 경우)로 보내려합니다.

가능한가, 어떻게 할 수 있습니까?

+0

좀 더 구체적으로 알려주시겠습니까? – FabioCosta

답변

0

내가 아는 한, 이렇게 할 방법이 없습니다. 당신은 쿼리 빌더를 사용할 수 있지만 모든 모델 capabilites을 풀 : YII이 모든 DB 작업이 모델의 CRUD에서 수행되는 방식을 설정하는 방법을 정의 할 수있는 기회가 있다면 내가 포럼에 요구했다 http://www.yiiframework.com/doc/guide/1.1/en/database.query-builder

. 예를 들어, 표준 제공된 select 대신 저장 프로 시저를 사용하려면 update delete를 삽입하십시오.

0

테이블에 대한 데이터베이스 뷰 모델을 생성하거나 생성 할 수 있어야합니다. 단순히 테이블 이름 대신보기 이름을 사용하십시오. 따라서 결과를보고 싶을 때 데이터베이스보기 모델을 호출하고 편집 할 때 테이블 모델을 호출하십시오.

2

당신은

어떤 방법으로, this one

처럼 연결된 게시물도 봐하지만 here 제안 무엇에 관심이있을 수 있습니다, 나는뿐만 아니라 같은 문제를 겪고 있고, 내 원하는 해결 방법은 하나 낮은 코드 비용으로 효과적인 솔루션을 제공합니다. 물론 그것에 대해 생각하면 시간이 많이 걸리지 만 결과가 좋지 않은 것들을 시도하는 것보다 낫습니다.

필자의 경우,보기는 읽기 시나리오에서 몇 가지 새로운 특성을 가졌습니다.이 특성은 업데이트 나 삽입시 시나리오에서 제거해야했습니다. 코어 클래스 (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(); 
}