Zend framework 在Zend框架中使用数据映射器

Zend framework 在Zend框架中使用数据映射器,zend-framework,datamapper,fetch,Zend Framework,Datamapper,Fetch,例如: 我需要检索一组男性用户的ID、名字和姓氏,但没有其他内容 因此,我在UserMapper中有一个名为fetchAllMaleUsers()的函数,它返回一组用户实体 i、 e: 此函数是否属于映射器层 是否可以只设置每个用户实体的Id、Firstname和LastName 1) 对于mapper/Gateway或您如何称呼它都非常好。 2) 你可以这样做,但我强烈反对。为什么?在以后的应用程序中,您无法分辨从何处获得模型。因此,每次您不确定是否设置了某个值,或者需要自动加载缺少的值(这与

例如:

我需要检索一组男性用户的ID、名字和姓氏,但没有其他内容

因此,我在UserMapper中有一个名为fetchAllMaleUsers()的函数,它返回一组用户实体

i、 e:

  • 此函数是否属于映射器层
  • 是否可以只设置每个用户实体的Id、Firstname和LastName
  • 1) 对于mapper/Gateway或您如何称呼它都非常好。

    2) 你可以这样做,但我强烈反对。为什么?在以后的应用程序中,您无法分辨从何处获得模型。因此,每次您不确定是否设置了某个值,或者需要自动加载缺少的值(这与缺少的值一样糟糕),都必须检查模型中是否设置了该值。另一个原因是,在可能需要用户模型的其他属性的情况下,不能将该函数重用于其他位置。afaik的最后一个原因是,模型在任何时候都代表完整的实体,而不是它的一部分。而且没有真正的理由不加载所有字段(除了对其他实体的引用,为什么应该自动加载)

    随着Fge的回复,我相信$resultSet应该已经返回类型为Application\u Model\u User的值。如果没有,您可能需要在应用程序\u Model\u DbTable\u User中设置$\u rowClass。

    谢谢,我只是犹豫不决,因为查询每一列对数据库来说似乎都是不必要的计算。但也许这不是问题。所以,每当我试图获取一个用户实体的属性时,我就应该将每一列映射到一个用户实体?@Craig:是的。有趣的是,人们一开始往往在错误的地方进行优化。从同一个db表中获取额外的列几乎没有开销(当然,如果您在那里存储二进制数据…)。如果您想优化您的应用程序,zend框架和php代码是一个很好的开始(一般来说,任何更复杂的db查询或db布局)。这是一个好的开始,因为mode/mapper的东西是(以及你的其他评论)是,嗯,我是基于Zend框架的快速入门,它在Application_Model_GuestbookMapper中的fetchAll()下也迭代$resultSet,将值映射到一个新的Application_Model_Guestbook。这不是最佳实践吗?您是否推荐ZF中有关mapper和域层的更深入的资源?Fge发布的链接应涵盖mapper部分。我想说的是,根据使用的获取机制,模型将自动创建一个填充的模型对象。我不是100%确定,但我相信您必须扩展Zend_Db_Table_Row_Abstract,才能将类用作$\u rowClass?这意味着模型获得了底层DB模式的知识,这正是数据映射器模式试图避免的。但当然,您必须权衡这一点,而不是仅仅为了创建模型对象而对结果集进行迭代。。。
    public function fetchAllMaleUsers() {
            $select = $this->getDbTable()
                            ->select()
                            ->from($this->getDbTable(),
                                    array('ID', 'FirstName', 'LastName'))
                            ->where('Gender = ?', 'M');
    
            $resultSet = $this->getDbTable()->fetchAll($select);
    
            $users = array();
            foreach ($resultSet as $row) {
                $user = new Application_Model_User();
                $user->setId($row->ID)
                     ->setFirstName($row->FirstName)
                     ->setLastName($row->LastName);
                $users[] = $user;
            }
    
            return $users;
        }