【问题标题】:Combined Data from 2 Domain Models来自 2 个领域模型的组合数据
【发布时间】:2010-01-31 11:04:47
【问题描述】:

我正在尝试实现Data Gateway / Domain Pattern。我了解基础知识以及将域逻辑与持久数据层分离的奇妙模式。现在我有以下要求:

假设我有 2 个域模型:用户和公司。当我想检索所有用户的用户列表时,我会这样做:

$userGateway = new Model_UserGateway();

$users = $userGateway->fetchAll();

foreach ($users as $user) {...}

效果很好,但现在棘手的部分是:我现在想要一个包含所有用户及其对应公司的列表。我可以遍历相关公司的每个用户的用户和实例,但这...不是我最喜欢的解决方案。在最坏的情况下,我会生成嵌套的数据库查询。另一种方法是,我使用网关获取额外的用户数据并处理它们......我不知道:(

获取包含公司信息的用户列表的最佳实践是什么?

提前致谢

迈克尔·M

【问题讨论】:

    标签: php model dns design-patterns


    【解决方案1】:

    在您的Model_UserGateway 中实现类似fetchAllWithCompany 的方法。在此方法中,您执行从两个表中获取信息的数据库查询。例如

    SELECT * 
    FROM user 
    LEFT JOIN company ON user.id = company.user_id
    

    然后你就会得到你想要的所有信息:

    $users = $userGateway->fetachAllWithCompany();
    

    这就是我要做的方式。正如您所说,为每个用户创建一个查询以获取该公司并不好。

    编辑:

    假设你的User 对象有一个getCompany 方法,你可以这样做:

    foreach($users as $user) {
        $company = $user->getCompany()
    }
    

    当然getCompany 应该返回一个Company 对象。

    你想实现这个来学习吗?因为很多框架都支持这种数据库抽象,例如Zend framework

    【讨论】:

    • 感谢您的回答! userGateway 返回一组用户对象,什么会返回 fetchAllWithCompany 方法?
    • @michaelm:也是一组用户对象。并且用户对象应该有一个方法getCompany
    • 我假设一个“值”对象必须用所有数据完全实例化?所以我必须在用户网关中获取所有公司数据才能在用户模型中正确实例化公司模型,对吗? (如果没有,我可以想象,有一个延迟加载模型模式:-))
    猜你喜欢
    • 1970-01-01
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多