1

我想找到一种从 ZF2 访问我的数据库的好方法。我不想从我的模型或控制器中执行此操作,也不想使用任何 ORM 工具,例如 Doctrine(除非有人很好地说服了我!)。

教程应用程序使用表数据网关模式;它创建一个AlbumTable访问album数据库中表的类。我担心这种方法,因为我将制作一个规范化的数据库,我需要在其中加入几个表来表示一些模型。据我了解,这不能在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 关系。但是,如果我不需要加入,那么使用表数据网关肯定可以让我免于编写一堆代码。

所以,我想我的问题是,这两种方法的结合是否会根据情况而有所作为?例如,如果我只需要访问单个表(不与其他表连接),那么我可以使用表数据网关,如果我需要连接多个表,我可以使用其他方法。这是个好主意还是坏主意?有没有更好的选择?

先感谢您!

4

1 回答 1

2

我将 Mapper 类与 Entity 对象一起使用。为了避免为简单的用例编写过多的重复代码,我使用 ZfcBase 的AbstractDbMapper来扩展我的特定映射器。

于 2012-11-24T13:59:00.503 回答