我不知道这是什么最好的做法。 假设我有一些分层对象:
Neighborhood
Family
所以每个家庭都住在一个社区。 对象映射如下:
class Neighborhood {
public $id;
public $name;
public $nr_families;
}
class Family {
public $id;
public $name;
public $neighborhood_id;
}
每个对象都为自己的数据库表建模。一个类型的所有对象都保存在全局scape中的数组中,因此有2个数组。
我怎么知道,在邻居对象中,在创建日期,有多少家庭在那个社区,没有再次查询数据库或访问全局家庭数组?假设Family数组首先生成,它们已经存在,现在当我生成Neighborhood数组时,这些对象需要具有一个属性,其中包含每个数组中的族数。此属性与数据库字段不匹配,必须立即计算。
有设计模式吗?我应该使用某种第三种物体吗?
答案 0 :(得分: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 :(得分: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;
}
}