在模型中解决此问题的最佳方法是什么?

时间:2010-07-23 06:39:26

标签: php model-view-controller oop

我经常遇到这个问题,如果有更好的方法,我一直很好奇。

考虑这一点(仅限示例,假设一个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;
    }

}

基本上,我需要使用大量的数据库查询,但它们都需要经过后处理才能为它们分配内容。我一直在使用上面的模式。

这是最好的做法吗?

2 个答案:

答案 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

祝你好运