Php 来自2个领域模型的组合数据

Php 来自2个领域模型的组合数据,php,model,dns,design-patterns,Php,Model,Dns,Design Patterns,我正在努力实现这个目标。我了解基本知识,它是一种将域逻辑与持久数据层分离的奇妙模式。现在我有以下要求: 假设我有两个域模型:用户和公司。当我想要检索包含所有用户的用户列表时,我会这样做: $userGateway = new Model_UserGateway(); $users = $userGateway->fetchAll(); foreach ($users as $user) {...} 这样做很好,但现在有一个棘手的部分:我想现在有一个所有用户及其对应公司的列表。我可以遍

我正在努力实现这个目标。我了解基本知识,它是一种将域逻辑与持久数据层分离的奇妙模式。现在我有以下要求:

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

$userGateway = new Model_UserGateway();

$users = $userGateway->fetchAll();

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

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

提前谢谢


Michael M

在您的
Model\u 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
对象


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

谢谢你的回答!userGateway返回一组用户对象,什么会返回fetchAllWithCompany方法?@michaelm:也是一组用户对象。而且用户对象应该有一个方法
getCompany
假设一个“值”-对象必须与所有数据完全实例化?因此我必须在用户网关中获取所有公司数据,以便在用户模型中正确实例化公司模型,对吗?(如果不是,我可以想象,存在一个延迟加载模型模式:-)