2011-07-26 73 views
1

我不知道最佳做法是什麼。 比方說,我有一些分層對象:對象之間的溝通

Neighborhood 
Family 

因此,每個家庭住在附近。 的對象映射這樣的:

class Neighborhood { 
    public $id; 
    public $name; 

    public $nr_families; 
} 

class Family { 
    public $id; 
    public $name; 
    public $neighborhood_id; 
} 

每個對象模型它自己的數據庫表。一個類型的所有對象都保存在全局scape中的數組中,所以有2個數組。

在CREATION DATE中,如何從鄰里對象內部知道該鄰居中有多少家庭,而無需再次查詢數據庫或訪問全局家庭數組?我們假設Family數組是先生成的,它們已經在那裏了,現在當我生成Neighbour陣列時,這些對象需要有一個屬性,每個屬性都有一個族。該屬性與數據庫字段不匹配,必須在運行時進行計算。

有沒有設計模式?我應該使用某種第三個對象嗎?

回答

1

如果你不想使用額外的查詢,你需要遍歷家庭列表來檢查家庭的鄰居ID。因爲不鼓勵使用全局變量,所以可以使用一些依賴注入來告訴鄰居關於這些家族的信息。

說你的Neighborhood對象有一個包含家族列表的靜態變量。外面你的對象,你設置該變量:

Neighborhood::$families = $families; 

鄰居現在可以遍歷該列表,檢查家庭的鄰里ID:

class Neighborhood { 
    function getNumberOfFamilies() { 
     $myFamilies = array(); 
     foreach(self::$families as $family) { 
      if($family->neighborhood_id === $this->id) { 
       $myFamilies[] = $family 
      } 
     } 
     $this->nr_families = count($myFamilies); 
     return $families; 
    } 
} 

將這項工作?

1

歡迎來到對象關係映射的美妙世界。

一個對象只應該「知道」(關於它自己的存儲屬性)。爲什麼不這樣做:

class Neighborhood { 
    public $id; 
    public $name; 
    private $num_families; 

    public function getNumFamilies() { 
     if (!is_int($this->num_families)) { 
      // do a database query 
      $this->num_families = $result; 
     } 
     return $this->num_families; 
    } 

}

+0

但家庭的數量不能是附近的財產嗎?我不存儲有關Family對象的信息。 – Dan

+0

當然,你可以懶加載它 - 見編輯答案。至於鄰里的家庭數量是通過財產還是訪問者(獲取者)訪問 - 誰在乎。訪問器更靈活。 – alexantd