0

我使用 zf2 的 tableGateway,但我不确定它会导致什么设计。

这是如何使用 zf2 的 tableGateway 进行插入的规范示例(来自文档):

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 数组,并为每个这些属性添加一个元素,这似乎是多余的。我错过了什么吗?

4

2 回答 2

2

另一种方法是使用 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();
于 2014-04-24T13:42:21.137 回答
1

您可能想看看我的QuickStart 101 教程

基本上你可以这样做:

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
}
于 2014-04-23T19:39:11.927 回答