使用 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 替换?

ZF2 - 使用 Ajax 填充选择

使用 Zend 框架 2 将数据插入和更新到两个表(事务)中

绑定到实现细节的数据库单元测试

ZF2:TableGateway ResultSet 到 JSON

使用 TableGateway ZF2/ZF3 编写类测试