使用 zend 2 的 tableGateway 进行插入
Posted
技术标签:
【中文标题】使用 zend 2 的 tableGateway 进行插入【英文标题】:Doing inserts with zend 2's tableGateway 【发布时间】:2014-06-08 19:06:11 【问题描述】:我使用 zf2 的 tableGateway,但我不确定它导致的设计。
这里是如何使用 zf2 的 tableGateway 进行插入的规范示例(from the docs):
public function saveAlbum(Album $album)
$data = array(
'artist' => $album->artist,
'title' => $album->title,
);
$id = (int)$album->id;
if ($id == 0)
$this->tableGateway->insert($data);
else
if ($this->getAlbum($id))
$this->tableGateway->update($data, array('id' => $id));
else
throw new \Exception('Form id does not exist');
但定义 $data 数组似乎是多余的,因为我已经有一个 Album 类,如下所示:
class Album
public $id;
public $artist;
public $title;
public function exchangeArray($data)
$this->id = (isset($data['id'])) ? $data['id'] : null;
$this->artist = (isset($data['artist'])) ? $data['artist'] : null;
$this->title = (isset($data['title'])) ? $data['title'] : null;
在我自己的项目中,我有一个包含大约 25 个属性的模型(一个包含 25 列的表)。必须定义具有 25 个属性的类,而不是在实现 tableGateway 的类的方法内部编写一个 $data 数组,其中每个属性都有一个元素,这似乎是多余的。我错过了什么吗?
【问题讨论】:
【参考方案1】:另一种方法是使用 RowGateway http://framework.zend.com/manual/2.3/en/modules/zend.db.row-gateway.html
简而言之,我将从 \Zend\Db\RowGateway\AbstractRowGateway 类扩展专辑类。
<?php
namespace Module\Model;
use Zend\Db\RowGateway\AbstractRowGateway;
use Zend\Db\Adapter\Adapter;
use Zend\Db\Sql\Sql;
class Album extends AbstractRowGateway
protected $primaryKeyColumn = array( 'id' );
protected $table = 'album';
public function __construct( Adapter $adapter )
$this->sql = new Sql( $adapter, $this->table );
$this->initialize();
然后你可以这样做
$album->title = "Some title";
$album->save();
或者
$album->populate( $dataArray )->save();
【讨论】:
【参考方案2】:你可能想看看我的QuickStart 101 Tutorial。
基本上你可以这样做:
saveAlbum(Album $albumObject)
$hydrator = new ClassMethods(false);
$albumArray = $hydrator->extract($albumObject);
// v-- not too sure if that one-liner works; normal if() in case it doesn't
isset($albumArray['id']) ? unset($albumArray['id']) :;
// insert into tablegateway
【讨论】:
嘿嘿,真漂亮。我不明白最后一行,你为什么要这样做: isset($albumArray['id']) ?未设置($albumArray['id']) :; 好吧,ID 字段不应该存在于要更新或插入的 DATA 上(因为它通常是 autoID)。因此,只有在它存在时才将其删除,在新对象上不是这种情况,但对于编辑对象是这样。以上是关于使用 zend 2 的 tableGateway 进行插入的主要内容,如果未能解决你的问题,请参考以下文章
Zend/ZF2/TableGateway mysql_insert_id 替换?
使用 Zend 框架 2 将数据插入和更新到两个表(事务)中