2012-11-23 3 views
1

ZF2에서 데이터베이스에 액세스하는 좋은 방법을 찾고 싶습니다. 내 모델이나 컨트롤러에서이 작업을 수행하고 싶지 않으며 Doctrine과 같은 ORM 도구를 사용하고 싶지 않습니다 (누군가가 나를 설득력있게 수행하지 않는 한!).Zend Framework 2의 데이터베이스 액세스

tutorial application은 테이블 데이터 게이트웨이 패턴을 사용하고 있습니다. 데이터베이스의 album 테이블에 액세스하는 클래스 AlbumTable을 작성합니다. 나는 몇몇 모델을 표현하기 위해 여러 테이블을 조인 할 필요가있는 정규화 된 데이터베이스를 만들 것이므로이 접근법에 대해 우려하고있다. 내가 이해하는 한, TableGateway 클래스로는이 작업을 수행 할 수 없습니다. 물론, 당신은 $tblgateway->getSql()을 할 수 있었고 거기에서부터 갈 수 있었지만, 그런 종류의 테이블 데이터 게이트웨이 패턴의 목적을 무너 뜨렸다.

그래서 저는주의를 Zend\Db\Sql\Sql으로 바꿨습니다. 앨범의 예제에, 나는 다음과 같은 작업을 가지고 :

class AlbumMapper { 
    private $sql; 

    public function __construct(Sql $sql) { 
     $this->sql = $sql; 
    } 

    public function getAlbum($id) { 
     $id = (int) $id; 

     $select = $this->sql->select(); 
     $select->from('album'); 
     $select->where(array('id' => $id)); 

     $statement = $this->sql->prepareStatementForSqlObject($select); 
     $result = $statement->execute(); 
     $row = $result->current(); 

     $album = null; 

     if ($row) { 
      $album = new Album(); 

      $album->setTitle($row['title']); 
      $album->setArtist($row['artist']); 
      $album->setId($row['id']); 
     } 

     return $album; 
    } 
} 
여기서 요점은 내가 $select->join()를 호출하고 내 데이터베이스를 쿼리하는 나에게 더 많은 컨트롤을 줄 것이라고 여러 테이블을 가입하고 1 제거 할 수 있다는 것입니다

: 1 관계를 내 모델과 테이블 사이. 그러나 내가 가입 할 필요가 없다면 테이블 데이터 게이트웨이를 사용하면 분명히 많은 코드를 작성하지 않아도됩니다.

상황에 따라 두 가지 방법의 조합이 좋은지 궁금합니다. 예를 들어, 단일 테이블 (다른 테이블과 조인하지 않음)에만 액세스해야하는 경우 테이블 데이터 게이트웨이를 사용할 수 있으며 여러 테이블을 조인해야하는 경우 다른 방법을 사용할 수 있습니다. 이것은 좋은 생각입니까 아니면 나쁜 생각입니까? 더 좋은 대안이 있습니까?

미리 감사드립니다.

답변

2

나는 Mapper 클래스를 Entity 객체와 함께 사용합니다. 간단한 사용 사례에 대해 너무 많은 반복 코드를 작성하지 않으려면 ZfcBase의 AbstractDbMapper을 사용하여 내 특정 매퍼를 확장합니다.

+0

팁 주셔서 감사합니다! 'AbstractDbMapper' 클래스를 약간 수정하고 [샘플 구현] (http://pastebin.com/dqPfnsGA)을 수행했습니다. 괜찮 으면 좋겠지 만, 잠깐 시간을내어 그것이 당신이 의미하는 바가 있는지 (그리고 어떤 개선이 있는지) 확인해 주시면 감사하겠습니다. 감사. – Andy0708

+0

예, 그것이 제가 의미했던 것입니다. 사용자 엔티티 객체의 구현과 연결되어 있기 때문에 UserMapper에서 직접 hydrator를 인스턴스화하는 것을 고려할 것입니다. 사용자 구현을 변경하지 않고도 쉽게 스왑 할 수있는 것이 아닙니다. –

+0

좋은 지적 - 정말 고마워요. – Andy0708

관련 문제