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 を使用できます。複数のテーブルを結合する必要がある場合は、別の方法を使用できます。これは良い考えですか、それとも悪い考えですか? より良い代替手段はありますか?
前もって感謝します!