2010-03-12 4 views
3

Zend Framework를 사용하여 모델을 만들어 데이터베이스에 레코드를 삽입했습니다. 내 질문은 $this->insert($data) 이후에 다른 테이블에 레코드를 삽입 할 수 있도록 활성 테이블을 어떻게 바꿀 수 있습니까? 나는 다른 Model_DbTable해야한다고 생각여러 테이블에 삽입 할 모델 내에서 Zend_Db_Table 이름을 변경하는 방법

class Model_DbTable_Foo extends Zend_Db_Table_Abstract 
{ 
    protected $_name = 'foo'; 

    public function addFoo($params) 
    { 
    $data = array(
     'foo' => $params['foo'], 
    ); 
    $this->insert($data); 
    $foo_id = $this->getAdapter()->lastInsertId(); 

    $data2 = array(
     'bar' => $params['bar'] 
    ); 
    // I need to change the Db Table name here. 
    $this->insert($data2); 
    $bar_id = $this->getAdapter()->lastInsertId(); 
    } 
} 

답변

6

Zend_Db_TableTable Data Gateway이다. 그것

는 데이터베이스 테이블에 대한 게이트웨이 역할을합니다. 하나의 인스턴스가 테이블의 모든 행을 처리합니다.

즉, 테이블 당 하나의 클래스가 있습니다. Model_DbTable_Foo은 데이터베이스의 Foo 테이블과이 테이블 만 나타냅니다. 다른 테이블에 삽입을해서는 안됩니다. 그것은 당신이 다른 테이블 클래스를 사용하는 것입니다. 가장 깨끗한 옵션은 여러 테이블에 삽입을 처리하는 방법을 알고있는 TDG 위에 다른 레이어를 추가하는 것입니다 (예 :

class Model_Gateway_FooBar 
{ 
    protected $_tables; 

    public function __construct(Zend_Db_Table_Abstract $foo, 
           Zend_Db_Table_Abstract $bar) 
    { 
     $this->_tables['foo'] = $foo; 
     $this->_tables['bar'] = $bar; 
    } 

    public function addFoo($data) 
    { 
     $this->_tables['foo']->insert($data['foo']); 
     // yaddayaddayadda 
     $this->_tables['bar']->insert($data['bar']); 
    } 
} 

그러나, 앱 그리고 당신은 귀찮게 단순히 푸 클래스에서 다른 클래스의 새 인스턴스를 생성하지 않기로 결정하고, 예를 들어, 거기에서 삽입 할 수 있습니다

$otherTable = new Model_DbTable_Bar; 
$otherTable->insert($data); 

또 다른 옵션은 컨트롤러에 논리를 넣어하는 것입니다, 그러나 이것은 컨트롤러의 책임과 일반적으로 controllers should be kept thin and models should be fat하지 않기 때문에 나는 그것을 권장하지 않습니다.

여러 개의 삽입을 할 때, 두 개의 삽입이 예상대로 작동하도록 트랜잭션을 사용할 수도 있습니다.

$this->_tables['foo']->getAdapter()->beginTransaction(); 

다음 commit() 또는 rollback() 쿼리 결과에 따라.

ZF1.9부터 구체적인 하위 클래스를 먼저 정의하지 않아도 Zend_Db_Table의 인스턴스를 만들 수 있습니다.

$fooTable = new Zend_Db_Table('foo'); 

Zend_Db_Table in the ZF Reference Guide 장을 참조하십시오.

+0

훌륭한 조언! 나는 모든 거래에 대해 잊어 버렸고, 나는 확실히 그것들을 사용하고 싶다. 감사! – jwhat

+0

고든, 제발 왜 당신이 내 사용자 정의 Model_DbTable_Foo 및 Model_DbTable_Bar 대신 Zend_Db_Table_Abstract로 생성자에 $ foo와 $ bar 캐스트를 입력하고 싶지 설명해 주시겠습니까? – jwhat

+0

MySQL 트랜잭션에 관심이있는 다른 사람들을위한 메모 : 트랜잭션 지원을 위해 MyISAM에서 InnoDB로 DB 유형을 변경해야했습니다. – jwhat

1

Model_DbTable_Bar을 내부적으로 중 하나

호출 :

여기 내 코드는 지금까지의

class Model_DbTable_Foo ... { 
    public function addFooAndBar() { 
    ... 
    $bar = new Model_DbTable_Bar(); 
    $bar->insert($data2); 
    } 
} 

또는 외부 :

class ModelX ... { 
    public function addFoos() { 
    $foo = new Model_DbTable_Foo(); 
    $foo->insert($data); 
    $bar = new Model_DbTable_Bar(); 
    $bar->insert($data2); 
    } 
} 
+0

고유 테이블에 대한 고유 클래스는 의미가 있으며 더 깨끗합니다. 감사! – jwhat

0

또한 Zend_Db_Table 클래스를 사용할 수 있습니다. 다음과 같음 :

$fooTbl = new Zend_Db_Table('foo'); 
$lastFooID = $fooTbl->insert($data2) 
        ->getAdapter() 
        ->lastInsertId();