【问题标题】:Using data mappers in Zend Framework在 Zend Framework 中使用数据映射器
【发布时间】:2011-05-12 06:37:16
【问题描述】:

例如:

我需要检索一组男性用户的 ID、名字和姓氏,但仅此而已。

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

即:

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;
    }
  1. 这个函数是否属于映射层?
  2. 是否可以只设置每个用户实体的 Id、Firstname 和 LastName?

【问题讨论】:

    标签: zend-framework datamapper fetch


    【解决方案1】:

    1) 非常适合映射器/网关或您如何称呼它。
    2)你可以这样做,但我非常不鼓励这样做。为什么?稍后在您的应用程序中,您无法分辨出您是从哪里获得模型的。因此,每次您不确定是否设置了某个值或者您需要一些自动加载缺失值的东西(这与缺失值一样糟糕)时,您都必须检查模型中是否设置了一个值。另一个原因是您不能将该函数重用于可能需要用户模型的其他属性的其他组件。最后一个原因是,模型在任何时候都代表完整的实体,而不是它的一部分。并且没有真正的理由不加载所有字段(除了对其他实体的引用,为什么无论如何都应该自动加载)。

    【讨论】:

    • 谢谢,我只是犹豫了一下,因为查询每一列似乎对数据库来说是不必要的计算。但也许这不是问题。所以每当我尝试获取用户实体的属性时,我应该将每一列映射到用户实体?
    • @Craig:是的。有趣的是,人们一开始往往会在错误的地方进行优化。从同一个数据库表中获取额外的列几乎没有开销(当然,如果你在那里存储二进制数据......)。如果您想优化您的应用程序,zend 框架和您的 php 代码是一个好的开始(以及任何更复杂的 db-queries 或 db-layout)。了解模式/映射器的想法(以及您的其他评论)是 survivethedeepend.com/zendframeworkbook/en/1.0weierophinney.net/matthew/archives/… 的良好开端
    【解决方案2】:

    连同 Fge 的回复,我相信 $resultSet 应该已经返回 Application_Model_User 类型的值。如果没有,您可能需要在 Application_Model_DbTable_User 中设置 $_rowClass。

    【讨论】:

    • 嗯,我基于 Zend Framework 的快速入门,它在 Application_Model_GuestbookMapper 的 fetchAll() 下也遍历 $resultSet,将值映射到新的 Application_Model_Guestbook。这不是最佳实践吗?您是否推荐 ZF 中有关映射器和域层的更深入资源?
    • Fge 发布的链接应该涵盖映射器部分。我要说的是,根据所使用的获取机制,模型将自动创建一个填充的模型对象。
    • 我不是 100% 确定,但我相信您必须扩展 Zend_Db_Table_Row_Abstract 才能将类用作 $_rowClass?这意味着模型了解底层数据库模式,这是数据映射器模式试图避免的。但当然,您必须权衡这一点,而不是仅仅为了创建模型对象而对结果集进行迭代......
    猜你喜欢
    • 2011-01-30
    • 1970-01-01
    • 2012-10-01
    • 2013-02-11
    • 2011-11-29
    • 2011-08-16
    • 1970-01-01
    • 2011-10-05
    • 2013-06-26
    相关资源
    最近更新 更多