ZendFramework メモ (3)  TableGateway 

# 概要

> (1) Zendライブラリ内にあり、composer.jsonからcomposer update 等で./vendorへ配置できる。

> (2) TableGatewayクラスは、TableGatewayInterfaceインタフェースを実装するAbstractTableGatewayクラスを拡張され、全ての操作はインタフェースで定義される

[https://framework.zend.com/apidoc/2.1/classes/Zend.Db.TableGateway.TableGatewayInterface.html](https://framework.zend.com/apidoc/2.1/classes/Zend.Db.TableGateway.TableGatewayInterface.html)

```php5


namespace Zend\Db\TableGateway;

use Zend\Db\ResultSet\ResultSetInterface;
use Zend\Db\Sql\Where;

interface TableGatewayInterface
{
    public function getTable() : string;
    public function select(Where|callable|string|array $where = null) : ResultSetInterface;
    public function insert(array $set) : int;
    public function update(
        array $set,
        Where|callable|string|array $where = null,
        array $joins = null
    ) : int;
    public function delete(Where|callable|string|array $where) : int;
}
```
## TableGatewayクラス

```php5
namespace Zend\Db\TableGateway;

use Zend\Db\Adapter\AdapterInterface;
use Zend\Db\ResultSet\ResultSet;
use Zend\Db\ResultSet\ResultSetInterface;
use Zend\Db\Sql;
use Zend\Db\Sql\TableIdentifier;

class TableGateway extends AbstractTableGateway
{
    public $lastInsertValue;
    public $table;
    public $adapter;

    public function __construct(
        string|TableIdentifier $table,
        AdapterInterface $adapter,
        Feature\AbstractFeature|Feature\FeatureSet|Feature\AbstractFeature[] $features = null,
        ResultSetInterface $resultSetPrototype = null,
        Sql\Sql $sql = null
    );

    /** Inherited from AbstractTableGateway */

    public function isInitialized() : bool;
    public function initialize() : void;
    public function getTable() : string;
    public function getAdapter() : AdapterInterface;
    public function getColumns() : array;
    public function getFeatureSet() Feature\FeatureSet;
    public function getResultSetPrototype() : ResultSetInterface;
    public function getSql() | Sql\Sql;
    public function select(Sql\Where|callable|string|array $where = null) : ResultSetInterface;
    public function selectWith(Sql\Select $select) : ResultSetInterface;
    public function insert(array $set) : int;
    public function insertWith(Sql\Insert $insert) | int;
    public function update(
        array $set,
        Sql\Where|callable|string|array $where = null,
        array $joins = null
    ) : int;
    public function updateWith(Sql\Update $update) : int;
    public function delete(Sql\Where|callable|string|array $where) : int;
    public function deleteWith(Sql\Delete $delete) : int;
    public function getLastInsertValue() : int;
}

```


# 基本的な使い方
```php5

use Zend\Db\TableGateway\TableGateway;

$projectTable = new TableGateway('project', $adapter);
$rowset = $projectTable->select(['type' => 'PHP']);

foreach ($rowset as $projectRow) {
    echo $projectRow['name'] . PHP_EOL;
}

// Or, when expecting a single row:
$artistTable = new TableGateway('artist', $adapter);
$rowset      = $artistTable->select(['id' => 2]);
$artistRow   = $rowset->current();

var_dump($artistRow);

```

> TableGateway オブジェクトは、インスタンスへの依存関係とオプションを取得するためにコンストラクタを使用します。テーブル名とアダプターのインスタンスは、インスタンスを作成するために必要なすべてです。上の実装では、テーブル構造やメタデータに関する仮定は行われず、select() が実行されると、アダプターの結果 (データ ソース) が設定された単純な ResultSet オブジェクトが返される。


# 参考
[https://docs.zendframework.com/zend-db/table-gateway/](https://docs.zendframework.com/zend-db/table-gateway/)
[http://matstani.github.io/blog/2014/03/02/zf2-db-transaction/](http://matstani.github.io/blog/2014/03/02/zf2-db-transaction/)
[https://olegkrivtsov.github.io/zf3-api-reference/html/classes/Zend/Db/Adapter/Driver/Pdo/Connection.html](https://olegkrivtsov.github.io/zf3-api-reference/html/classes/Zend/Db/Adapter/Driver/Pdo/Connection.html)