我不知道最好的做法是什么。假设我有一些分层对象:
Neighborhood
Family
所以每个家庭都住在一个社区里。对象是这样映射的:
class Neighborhood {
public $id;
public $name;
public $nr_families;
}
class Family {
public $id;
public $name;
public $neighborhood_id;
}
每个对象建立自己的数据库表模型。在全局环境中,一个类型的所有对象都保存在一个数组中,因此有两个数组。
我怎么能知道,从内部邻居对象,在创建日期,有多少家庭在那个邻居,而不再次查询数据库或访问家庭的全局数组?假设首先生成了Family数组,它们已经在那里了,现在当我生成Neighborhood数组时,这些对象需要有一个包含每个家庭总数的属性。此属性与数据库字段不匹配,必须动态计算。
有设计模式吗?我要不要用第三人称?
如果不想使用额外的查询,则需要遍历家庭列表以检查家庭的社区id。因为不鼓励使用全局变量,所以您可以使用一些依赖注入来告诉邻居有关family的信息。
假设您的Neighborhood对象有一个包含家庭列表的静态变量。在你的对象之外,你设置这个变量:
Neighborhood::$families = $families;
Neighborhood现在可以遍历该列表,检查家庭的Neighborhood 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;
}
}
可以吗?
欢迎来到对象关系映射的奇妙世界。
对象应该只"知道"自己(存储关于自己的属性)。为什么不这样做呢?
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;
}
}