我经常遇到这个问题,如果有更好的方法,我一直很好奇。
考虑这一点(仅限示例,假设一个OO查询构建器)
class Dogs extends Pets {
public function getAll() {
return $this->parseRows($this->db->get('dogs'));
}
public function getBig() {
return $this->parseRows($this->db->get('dogs')->where('size', '>', 10));
}
public function getSmelly() {
return $this->parseRows($this->db->get('dogs')->where('smell', '=', 'bad'));
}
private function parseRows($rows) {
foreach($rows as &$row) {
$row['id'] = (int) $row['id'];
$row['categoryName'] = Categories::getById($row['categoryId']);
}
return $rows;
}
}
基本上,我需要使用大量的数据库查询,但它们都需要经过后处理才能为它们分配内容。我一直在使用上面的模式。
这是最好的做法吗?
答案 0 :(得分:2)
对我而言,公共界面看起来不错。关于实现,有很多要说的,因为对象关系映射器是现代编程恕我直言的基石之一。
如果您想了解有关实施ORM的其他方法的更多信息,我建议您查看开源框架,例如Doctrine或CakePHP的ORM。
关于私有实现,我想补充一点:如果Categories :: getById对数据库进行往返调用,那效率很低,因为有很多狗的表会导致(至少)db调用,这是次优的。这就是为什么上面提到的ORM允许开发人员指定关联(例如,Dog有一个类别)并自动生成“LEFT JOIN”语句。
答案 1 :(得分:0)
我更喜欢使用Symfony和Propel 1.5而不是Doctrine。在propel 1.5中,您可以生成面向对象的查询,例如:
http://www.propelorm.org/wiki/Documentation/1.5/WhatsNew
祝你好运