2013-02-04 44 views
1

我正在學習OOPHP的過程中,我正在尋找一些'最佳實踐'的建議。我應該使用'加入模型,或致電其他模型

對於關係數據庫,很多表中都有明顯的外鍵。當我爲我的網站創建模型時,我試圖確定在模型中執行JOIN查詢還是讓一個模型調用另一個模型更好?

調用其他模型似乎使代碼更加模塊化。無論哪種方式似乎創建依賴關係,無論是在另一個表或另一個模型。

如果我使用'調用其他模型'的方法,我似乎遇到了另一個問題:無限循環。這是我遇到的例子。我有2個表格,personschool。每個person有一個最喜歡的學校,由schoolId代表。每個school有一個principal,這是一個personId

該行被映射到person對象接受在其構造school對象,但學校行被映射到school對象接受在其構造person對象。

從我發現的,關於延遲加載的一些東西似乎是解決方案,但(我可能是錯誤的),似乎如果我這樣做,我不能使用PHP的類型提示。 (我猜很多人會向我推薦像Doctrine這樣的ORM工具,這是我將來肯定會研究的東西,我現在正在避免它,因爲它的學習曲線很陡,而且因爲我覺得我如果我自己嘗試一次,請稍後再理解這些工具)

+0

有很多模型,而不是連接做創建依賴關係,我不認爲這就是你想要做的。使用連接是正常的,我沒有看到它的任何問題。 – GGio

+0

但不加入創建依賴關係?如果一個表格被編輯用於大量的連接,你將不得不編輯所有這些連接查詢。有很多模型,你會更新1個模型,並且這些變化會傳播給所有調用它的人。 –

回答

0

不錯的問題!我有/有同樣的想法。我認爲這是一個非常好的主意,在查看框架之前自行創建代碼:)

當我編寫模型生成器時,我決定一次不使用JOINS並使用'延遲加載'。這意味着我有這樣的類(只是僞代碼):

class Person extends Model_Resource { 

    /** 
    * 
    */ 
    protected $name; 

    /** 
    * @var Address <-- external reference 
    */ 
    protected $address; 

    /** 
    * @return Person 
    */ 
    public static function select($filter) { 
     return DB::instance(filter_query('SELECT * FROM `person`', $filter)); 
    } 


    /** 
    * @return Address 
    */ 
    public function getAddress() { 
     // lazy loading : 
     if(is_null($this->address)) { 
      $this->address = Address::select(new Filter('p_id', $this->id)); 
     } 
     return $this->address; 
    } 

} 

這對多年來在中等規模的應用程序中運行良好。當我真的需要加快速度或使用某種不規則的查詢時,我可以自由地覆蓋自動生成的方法並使用JOINS,UNION等...

我很好奇別人會說什麼。

+0

我承認我最近開始使用CodeIgniter。它的表單驗證是真正賣給我的。幾分鐘後,我可以花幾天時間做自己的驗證。 –

+0

我沒有告訴,不要使用它們。如果您對此感到滿意,那麼請使用框架,當然! ;) – hek2mgl

+0

您發佈的代碼引發了另一個有趣的問題。我遇到了一些喜歡將MVC模式分成多個(僞)層的人,這是我見過的稱爲「實體」的東西。例如,我會有一個'person'類,它只是簡單地存儲像firstName,lastName,email這樣的信息,以及像getName()這樣簡單的幫助器方法,這些方法將連接並大寫姓和名。然後讓personModel實際執行數據庫交互並創建人員類。我實際上喜歡這種方法,並使用它。但是這會使延遲加載變得更加困難。想法? –

相關問題