私の会社が購入したデータウェアハウスへのレポート拡張機能を書いています。データウェアハウスはデータモデル中立であり、テーブルの関係とフィールドのメイヤーデータを格納するテーブルを持っています。これは私がやっていることである基本的なORMクラスを書くのはかなり簡単です。それはすべて動作しますが...ORMクラスを手渡すハンド - シングルトン、静的親、?
私のORMクラスは、PDOインスタンス、テーブルのフィールド(ホワイトリストとして使用される)、およびフィールドのメタルレイヤ情報を保持します。また、テーブル関係のマッピング(FROM/JOIN句の生成)とWebから提供されるフィルタのマッピング(WHERE句の生成)のための便利な機能も備えています。
SELECT句は、要求されたモデルに基づいて、ORMの子クラスで生成されます。ページが読み込まれると、いくつかのモデルが構築される必要があります。明らかに、私はORM(モノステートのような)のインスタンスを1つだけ必要としますが、子クラスがインスタンス化されるたびに親クラスのクエリーをやり直さずに、各子クラスがORMのプロパティと便利関数を継承するようにしたいと思います。
ここではシングルトンパターンが当てはまるかもしれませんが、シングルトンをサブクラス化することは困難です。私はちょうど静的なプロパティを正しく動作させるように見えることはできません。
私は近くにいると思うが、私は何かを見逃しているか、これをあまりにも難しくしている。私は今、プロパティを薄いクラスに落としてそこから伸びていくことを検討しています。私はこのトピックについて同様の質問を見たことがありますが、明確な解決策を思い付いていません。
私は仕事中ではありませんが、これは私がしようとしていることの要点を示すコードの単純な例です。
Class ORM {
protected $conn;
protected $fields;
protected $relations;
protected $table;
protected $sql;
public function __construct ($view, $database) {
$this->conn = new PDO(...$database...);
$this->table = $view;
$this->getFields();
$this->getRelations();
}
private function getFields() {
//select fields from metalayer where table = $table;
//$this->fields = $result;
}
private function getRelations() {
//select relations from relations where table = $table;
//$this->relations = $result;
}
protected function mapTables ($tables) {
// $this->sql = "FROM $this->table";
// foreach ($tables as $table) {
// $this->sql .= "LEFT JOIN $table ON $relations[$table]['key1'] = $relations[$table]['key2'];
}
protected function mapFilters ($filters) {
// $this->sql = "WHERE 1=1";
// foreach $filters as $filter {
// $this->sql .= "AND ($filter['field'] = $filter['criterion1'] OR ...criterion2, etc.)
}
}
Class ExampleModelDAO extends ORM {
public function __construct($view, $database, $params) {
parent::__construct($view, $database);
// parse params
parent::mapTables($tables);
parent::mapFilters($filters);
}
public function get() {
// Prepend $this->sql with SELECT statement specific to model
// Query database and return model
}
}
PDOインスタンスを依存関係として渡す必要があります。これは、テストを行うときに模擬オブジェクトで置き換えるほうがずっと簡単です。 – Xeoncross