2017-01-12 24 views
0

我在我的數據庫(親子)兩個用戶表。我想有一些功能來檢查用戶的存在,返回一個用戶列表等,但我也想爲用戶特定功能,如獲取名稱,獲取電子郵件的行動(呼籲對象上操作),重置密碼等我應該將我的數據庫模型分爲特定於對象和特定於表格的操作嗎?

目前,我有這樣的:

<?php 
class User { 

    public $id; 
    public $email; 
    private $password; 
    public $accountType; 

    public function __construct(...) { 
     ... 
    } 

    // ####### GLOBAL ####### (Static) 
    // Searches for user by email 
    public function findUser($email) { 
     ... 
    } 


    // ####### GETTERS ####### 
    public function getID() { 
     ... 
    } 

    ... 

    // ####### SETTERS ####### 
    public function setID() { 
     ... 
    } 
} 

我知道,在OOP我應該只讓全局函數靜態的,但我不知道這是我應該在PHP。

+0

我會說,你是在完全錯誤的方式思考這個。你在談論兩個不同的問題(數據存儲/檢索和對問題域進行建模)。這些應該被視爲單獨的東西,因爲如果您以後決定使用一些陰天或NoSQL解決方案而不是傳統的DB,則可以相對容易地替換存儲層。其中一個最大的錯誤,PHP程序員做中混淆「模式」與「數據庫表」 – GordonM

回答

1

這真的取決於你 - 其實有關於如何處理「表操作」沒有明確的硬性規則(不像「記錄操作」每個人都同意應該是代表記錄的實例方法)。

一些例子:

  • Doctrine進行非「記錄操作」。用其它類,這裏的「表類」僅用於實例的方法。
  • Kohana ORM使用一個「空實例」(即沒有ID值)來表示該表,並做「表操作」

這是一個設計決策是非常給你。

+0

致謝,我開始慌了一點,但事實證明不是一個特定的方式,它應該做的事。 – Heraclitus

+1

我不同意記錄操作應該是實例上的方法!對象持久性和核心模型邏輯是獨立的關注點。 – GordonM

+0

你的方法雖然有爭議,但已經足夠普遍了。在大多數ORM庫中解決這個問題的通常方法是在父類中實現對象持久化,讓模型業務邏輯實現使用繼承附加到它。我發現這種方法易於理解和簡潔。因人而異。見CodeIgniter的模型(https://codeigniter.com/user_guide/general/models.html)的另一種方法(我不喜歡)。 – Guss

相關問題