2011-07-26 76 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