我正在爲我公司購買的數據倉庫寫一個Web報表擴展。數據倉庫是數據模型中立的,並且具有存儲表格關係和字段的元層數據的表格。這讓我很容易編寫一個基本的ORM類,這正是我想要做的。這一切都有效,但...手滾ORM類 - 單身,靜態父,?
我的ORM類包含PDO實例,表的字段(用作白名單)以及字段的元層信息。它還具有映射表關係的便利函數(生成FROM/JOIN子句)並映射Web提供的過濾器(生成WHERE子句)。
SELECT子句根據請求的模型在ORM的子類中生成。當頁面加載時,需要建立幾個模型。很顯然,我只需要ORM的一個實例(像monostate),但是我希望每個子類都繼承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 2012-03-30 02:32:11