Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 显示列表:集合与数组_Oop_Design Patterns_Datamapper - Fatal编程技术网

Oop 显示列表:集合与数组

Oop 显示列表:集合与数组,oop,design-patterns,datamapper,Oop,Design Patterns,Datamapper,在我的PHP MVC应用程序中,我有三个主要实体:组织、员工和角色。每个组织都有许多员工,每个员工都有一个角色 对于给定的组织,我希望显示员工列表。对于每个员工,我将显示姓名、地址详细信息和角色名称 现在,就我所见,最有效的方法是让我的服务层以数组的形式返回员工列表,其中每个元素都是一个数据字段数组(而不是对象)。在映射器中,我将角色表连接到employee表,因此正确的角色名称将出现在初始结果集中,并且无需再次查询数据库 另一种方法是让我的服务层返回Employee对象的集合。但是,在这种情况

在我的PHP MVC应用程序中,我有三个主要实体:组织、员工和角色。每个组织都有许多员工,每个员工都有一个角色

对于给定的组织,我希望显示员工列表。对于每个员工,我将显示姓名、地址详细信息和角色名称

现在,就我所见,最有效的方法是让我的服务层以数组的形式返回员工列表,其中每个元素都是一个数据字段数组(而不是对象)。在映射器中,我将角色表连接到employee表,因此正确的角色名称将出现在初始结果集中,并且无需再次查询数据库

另一种方法是让我的服务层返回Employee对象的集合。但是,在这种情况下,每个Employee对象都需要查询数据库以找到其角色的正确名称(假定角色是延迟加载的)。这将是非常低效的,但似乎更“面向对象”

我可以考虑在实例化雇员时将角色名加载到雇员的属性中,但是我仍然需要保持对唯一角色ID的引用,因此我马上就有同步考虑。

解决这个问题的典型方法是什么???我相信它已经解决了数百万次


谢谢

事实上,这些东西非常标准。但我仍在与之斗争

我的第一个想法是建立类似于:

class Employee 
{
    protected $name; //etc

    /**
     * @var Organization
     */
    protected $organization;

    /**
     * @var Role
     */
    protected $role;

    // And then getters/setters for Role and Organization
}
class EmployeeMapper
{
    /**
     * @Var DB
     */
    protectd $db;

    public function __construct(DB $db)
    {
        $this->db = $db
    }

    public function getEmployeesByOrganization($orgId)
    {
        // query here that joins employees, roles, and organizations
    }
}
然后是一个雇员映射器,类似于:

class Employee 
{
    protected $name; //etc

    /**
     * @var Organization
     */
    protected $organization;

    /**
     * @var Role
     */
    protected $role;

    // And then getters/setters for Role and Organization
}
class EmployeeMapper
{
    /**
     * @Var DB
     */
    protectd $db;

    public function __construct(DB $db)
    {
        $this->db = $db
    }

    public function getEmployeesByOrganization($orgId)
    {
        // query here that joins employees, roles, and organizations
    }
}
这给我的印象是干净,代表了你描述的结构

但问题是,当EmployeeMapper必须构造Employee对象时, 他需要知道关联查询结果中的角色字段和组织字段如何映射到角色和组织对象中的字段。对我来说,这些知识应该严格掌握在角色映射器和组织映射器中。因此,这些映射程序可能需要将此映射功能作为公共方法提供,并且我们需要有一种方法将RoleMapper和OrganizationMapper实例注入EmployeeMapper以供使用。有关基于ZF的示例,请参见

此外,有时,就像您提供的“查看员工列表”示例一样,您希望获得有关这些附加角色和组织实体的信息。在这种情况下,连接和构建对象图的开销是合理的(当然比对角色和组织进行单独的循环查询要好)。但在其他情况下,您实际上只需要单个员工的一些简单员工信息,如他的姓名或电话号码。在后一种情况下,为什么会产生连接和构建完整对象图的开销

对于这些问题,有一些体系结构解决方案,通常使用代理对象(代理角色和组织对象,并在需要时延迟加载它们)和自定义存储库对象(您希望在其中强制联接)


但我发现自己设计这一切是一件痛苦的事。最后,我发现一个类似ORM的人已经解决了所有问题,并为我提供了上述功能(代理、自定义存储库等)。

一个好的ORM应该能够在一个查询中获得关于员工列表及其角色的信息,并重新填充员工对象列表,每个员工都有一个role类型的字段,包含有关其角色的信息。没有任何东西阻止您将第一个选项用于对象而不是数组。瞧,高效且面向对象。嗨,fab,我该怎么做?同时生成员工集合和相关角色集合?太棒了,David,非常感谢。