Yii에서 모델을 만들고, 업데이트하고, 삭제하는 동안 여전히 기본 테이블로 이동하면서 데이터베이스 뷰에서 모델을 읽을 수 있습니까?Yii에서 모델을 생성, 업데이트 및 삭제하는 동안 데이터베이스 뷰에서 읽을 수 있습니까? 여전히 기본 테이블로 이동합니까?
기본적으로 모든 SELECT 문 특정 데이터베이스 뷰 (일부 추가 집계 열 또는 더티 읽기를 강요하는 경우)로 보내려합니다.
가능한가, 어떻게 할 수 있습니까?
Yii에서 모델을 만들고, 업데이트하고, 삭제하는 동안 여전히 기본 테이블로 이동하면서 데이터베이스 뷰에서 모델을 읽을 수 있습니까?Yii에서 모델을 생성, 업데이트 및 삭제하는 동안 데이터베이스 뷰에서 읽을 수 있습니까? 여전히 기본 테이블로 이동합니까?
기본적으로 모든 SELECT 문 특정 데이터베이스 뷰 (일부 추가 집계 열 또는 더티 읽기를 강요하는 경우)로 보내려합니다.
가능한가, 어떻게 할 수 있습니까?
내가 아는 한, 이렇게 할 방법이 없습니다. 당신은 쿼리 빌더를 사용할 수 있지만 모든 모델 capabilites을 풀 : YII이 모든 DB 작업이 모델의 CRUD에서 수행되는 방식을 설정하는 방법을 정의 할 수있는 기회가 있다면 내가 포럼에 요구했다 http://www.yiiframework.com/doc/guide/1.1/en/database.query-builder
. 예를 들어, 표준 제공된 select 대신 저장 프로 시저를 사용하려면 update delete를 삽입하십시오.
테이블에 대한 데이터베이스 뷰 모델을 생성하거나 생성 할 수 있어야합니다. 단순히 테이블 이름 대신보기 이름을 사용하십시오. 따라서 결과를보고 싶을 때 데이터베이스보기 모델을 호출하고 편집 할 때 테이블 모델을 호출하십시오.
당신은
어떤 방법으로, 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();
}
좀 더 구체적으로 알려주시겠습니까? – FabioCosta