2011-09-29 3 views
0

내 상사는 우리가 현재 작업하고있는 응용 프로그램이 데이터베이스의 여러 스키마를 통해 분할되기를 원합니다. 왜냐하면 그는 이름을 지정하여 데이터에 액세스 할 수있는 여러 응용 프로그램 (일부는 제어 할 수 없음)을 원하기 때문입니다. 대회는 DeploymentPrefix_Category입니다. 예를 들어, 생산을위한 몇 가지 스키마 (Production_Foo, Production_BarProduction_Baz)가 있고 나서 Staging_Foo, Staging_BarStaging_Baz의 스테이징 및 개발을위한 동일한 스키마 테이블이 있습니다.여러 스키마와 여러 배포에서 Zend_Db_Table을 사용하려면 어떻게해야합니까?

Zend_Db_Table은 내가 스키마를 지정할 수있게 해주지 만 그 스키마를 즉석에서 생성 할 수는 없지만 스키마에 해당 접두사를 넣으려면해야 할 것입니다.

어떻게 처리 할 수 ​​있습니까?

+0

짧은 대답 : 아마도 [this] (http://stackoverflow.com/questions/4437782/zend-framework-database-table-field-prefix-like-users-us-name) 도움이 될 것입니다 . – nevvermind

답변

1

다른 환경에 대한 다른 설정의 문제는 Zend_Config로 쉽게 처리 할 수 ​​있습니다. 빠른 시작에서 설정 섹션을 참조하십시오 : 이것은 당신이 각각의 환경에 대해 다른 설정을 지정할 수 있습니다

http://framework.zend.com/manual/en/learning.quickstart.create-project.html

.

스키마에 대해서는 Production_Foo에있는 테이블과 Production_Bar에있는 테이블이 있다고 생각합니다. 이 스키마 각각에 대해 Zend_Db_Table을 확장하고 구축시 올바른 데이터베이스를 가리키는 것을 고려하십시오. 다음과 같이

Zend_Db_Table의 생성자가 정의됩니다

public function __construct($config = array(), $definition = null) 
    { ... } 

우리는 $ 정의는 당신이 Zend_Db_Table_Definition에로드 배열을 전달할 수 있습니다 리드 위치를 확인하기 위해 끝까지.

스키마에 관해서는
/** 
* @param string $tableName 
* @param array $tableConfig 
* @return Zend_Db_Table_Definition 
*/ 
public function setTableConfig($tableName, array $tableConfig) 
{ 
    // @todo logic here 
    $tableConfig[Zend_Db_Table::DEFINITION_CONFIG_NAME] = $tableName; 
    $tableConfig[Zend_Db_Table::DEFINITION] = $this; 

    if (!isset($tableConfig[Zend_Db_Table::NAME])) { 
     $tableConfig[Zend_Db_Table::NAME] = $tableName; 
    } 

    $this->_tableConfigs[$tableName] = $tableConfig; 
    return $this; 
} 

, 당신은 단지 올바른 일을 가리키는 DB 어댑터 옵션의 다른 세트 전달이에 대한 옵션 중 하나는 테이블 이름입니다.

+0

우리는 이미 기본 Zend_Application 비트를 사용하여 여러 배포를 설정했습니다. 그러나 테이블 클래스의 스키마 참조에 접두어를 삽입하는 방법은 없습니다. –

+0

즉, 다른 Zend_Db_Table 클래스는 다른 스키마를 사용해야합니다. –

+0

Zend_Db_Table의 생성자에서 두 번째 매개 변수를 확인하십시오. 구성 객체 또는 배열을 정의에 전달할 수 있습니다. 설정할 수있는 매개 변수 중 하나는 테이블 이름입니다. public function setTableConfig ($ tableName, array $ tableConfig) –

1

글쎄, 나는 "Staging_Foo"- "Staging_Foo"- "Testing_Foo"와 같은 다른 스테이징 시나리오에 대해 서로 다른 테이블 이름을 갖는 것이 좋지 않다고 주장 할 것입니다. 그냥 "Foo"가 훨씬 쉽고 빠릅니다 생산은 ...

그러나 어쨌든이 : 개인적으로 나는 (내가 즉,이 호출 것 같아요) 테이블 - 데이터 게이트웨이를 사용 - Zend_Db_Table_Abstract 확장을 사용하여, 그래서 난 이런 식으로 할 것 :

class Application_Model_DbTable_Foo extends Zend_Db_Table_Abstract 
{ 
    public function __construct($config = array()) { 
    $this->_name = Zend_Registry::get('config')->env_tbl_prefix.'Foo'; 
    parent::__construct($config); 
    } 
} 

을 분명히 이렇게하려면 환경 접두어로 "env_tbl_prefix"키를 정의하기 위해 레지스트리에 저장된 구성을 config 내에 저장해야합니다. "Production_", "Staging_", "Testing_"등 ...

여전히 개발자 다. 모든 사람이 쉽게 사 용할 수 있도록 상사에게 말하라 ^^ 다른 테이블 이름을 사용하면 많은 단점이 있습니다. 환경에 따라 : \

+0

@ Sam에 동의합니다. 이것은 단지 끔찍한 생각입니다. 다른 준비 영역의 데이터를 혼합하지 않으려 고합니다. 최소한 스테이징 영역을 다른 데이터베이스 이름으로 분리해야합니다. 또는 다른 호스트를 사용하는 것이 더 좋습니다. –

+2

클래스 속성은 반드시 일정해야하므로 컴파일 할 때 평가할 수 있어야하며 평가할 때 런타임 정보에 의존해서는 안됩니다. – drew010

+0

@ drew010 알았어, 내가 지금까지 알아야 할 ... 그리고 나는 자신이하는 일을 잘한다. P :하지만 클래스가 zend db 테이블을 확장한다면 :'public function __construct ($ config) {$ this- > _name = Zend_Registry :: get ('config') -> env_tbl_prefix.Foo '; parent :: __ construct ($ config); }'작동해야합니다. – Sam

관련 문제