1

ZF2 からデータベースにアクセスするための良い方法を見つけたいと思っています。私は自分のモデルやコントローラーからこれを実行したくありませんし、Doctrine などの ORM ツールも使用したくありません (誰かが私を説得する良い仕事をしない限り!)。

チュートリアル アプリケーションは、Table Data Gateway パターンを使用しています。データベース内のテーブルに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 の関係を取り除くことができます。ただし、参加する必要がない場合は、Table Data Gateway を使用すると、大量のコードを作成する必要がなくなります。

それで、私の質問は、状況に応じて2つのアプローチの組み合わせが良いかどうかということでしょうか? たとえば、1 つのテーブルにのみアクセスする必要がある (他のテーブルと結合する必要がない) 場合は、Table Data Gateway を使用できます。複数のテーブルを結合する必要がある場合は、別の方法を使用できます。これは良い考えですか、それとも悪い考えですか? より良い代替手段はありますか?

前もって感謝します!

4

1 に答える 1

2

EntityオブジェクトでMapperクラスを使用します。単純なユースケースで繰り返しコードを書きすぎないようにするために、ZfcBaseのAbstractDbMapperを使用して、から特定のマッパーを拡張します。

于 2012-11-24T13:59:00.503 に答える