Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Zend Framework 2中的数据库访问_Php_Orm_Zend Framework2 - Fatal编程技术网

Php Zend Framework 2中的数据库访问

Php Zend Framework 2中的数据库访问,php,orm,zend-framework2,Php,Orm,Zend Framework2,我想找到一种从ZF2访问数据库的好方法。我不想在我的模型或控制器上这样做,也不想使用任何ORM工具,比如条令(除非有人能很好地说服我!) 使用表数据网关模式;它创建一个类AlbumTable,该类访问数据库中的album表。我关心这种方法,因为我将创建一个规范化的数据库,在这里我需要连接几个表来表示一些模型。据我所知,这不能用TableGateway类来完成。当然,您可以执行$tblgateway->getSql()并从那里开始,但我认为这样做会破坏表数据网关模式的用途 所以,我把注意力转向了Z

我想找到一种从ZF2访问数据库的好方法。我不想在我的模型或控制器上这样做,也不想使用任何ORM工具,比如条令(除非有人能很好地说服我!)

使用表数据网关模式;它创建一个类
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关系。但是,如果我不需要加入,那么使用表数据网关肯定可以避免我编写大量代码

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


提前谢谢你

我将映射器类与实体对象一起使用。为了避免为简单用例编写太多重复代码,我使用ZfcBase扩展了我的特定映射程序。

谢谢您的提示!我稍微修改了
AbstractDbMapper
类,并做了一个测试。它工作得很好,但如果您能花一点时间看看这是否是您的意思(如果您有任何改进),我将不胜感激。谢谢。是的,我就是这个意思。我会考虑直接在用户映射器中实例化水合物,因为它绑定到用户实体对象的实现,而不是在不改变用户的实现的情况下可以很容易地交换的东西。