Php Zend Framework 2中的数据库访问
我想找到一种从ZF2访问数据库的好方法。我不想在我的模型或控制器上这样做,也不想使用任何ORM工具,比如条令(除非有人能很好地说服我!) 使用表数据网关模式;它创建一个类Php Zend Framework 2中的数据库访问,php,orm,zend-framework2,Php,Orm,Zend Framework2,我想找到一种从ZF2访问数据库的好方法。我不想在我的模型或控制器上这样做,也不想使用任何ORM工具,比如条令(除非有人能很好地说服我!) 使用表数据网关模式;它创建一个类AlbumTable,该类访问数据库中的album表。我关心这种方法,因为我将创建一个规范化的数据库,在这里我需要连接几个表来表示一些模型。据我所知,这不能用TableGateway类来完成。当然,您可以执行$tblgateway->getSql()并从那里开始,但我认为这样做会破坏表数据网关模式的用途 所以,我把注意力转向了Z
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
类,并做了一个测试。它工作得很好,但如果您能花一点时间看看这是否是您的意思(如果您有任何改进),我将不胜感激。谢谢。是的,我就是这个意思。我会考虑直接在用户映射器中实例化水合物,因为它绑定到用户实体对象的实现,而不是在不改变用户的实现的情况下可以很容易地交换的东西。