我的问题主要是关于OOP和ORM设计。我正在为用户和组在Zend中创建模型,并为数据库使用映射器(也使用依赖注入)。我有一个关系表,user_groups
,用于链接。我正在尝试找出获取和设置用户组或组的用户的最佳方法。我目前正在寻找3个选项,如果我忘记了什么,请告诉我:
- 负责在mapper中连接db表,以便用户组看起来像用户模型的一部分
- 添加UserGroupsMapper:创建像user->addToGroup($group) 这样的函数
- 添加UserGroupsMapper 和 UserGroup模型:创建UserGroup -> Add ($user, $group)
关于选项1的思考:
模型和db表之间是否应该是一对一的关系,或者一个模型可以代表多个表?如果是这样,什么时候不可以呢?另一个例子:如果我有一个color
表和一个color_type
表(与"温暖"或"冷"的东西作为行),颜色包含colorType作为属性/实例变量吗?或者它通过color_type_id
作为对象引用ColorType,或者它有一个实际的ColorType对象作为ivar?
关于选项2的思考:
对于像user->addToGroup($group)这样的函数,它会调用UserMapper方法,然后调用UserGroupsMapper中的方法,还是会直接调用UserGroupsMapper中的方法?根据我的理解,映射器应该从数据中抽象出模型,但是就模型之间的关系而言,这意味着什么?模型应该知道它们是如何连接的,还是仅仅是映射器?
关于选项3的思考:
添加UserGroup模型可以在控制器中访问该模型。Group控制器应该知道模型关系(如userGroup对象),还是应该只能做一些事情(如告诉组添加用户)?
我希望这个问题足够清楚。我知道这很复杂,但我还没能找到一个好的答案。
通常你的模型只是简单的对象,表示表中的数据,并允许你获取和设置值。映射器是存放所有数据库访问和逻辑的地方。通常它们与您的数据是一对一的关系,但它们不一定是。只要你知道如何管理什么对象在哪里。
你将模型传递给映射函数,它将从那里获取信息。
所以我会把你的addUserToGroup放在一个映射器中,而不是模型本身。
一般来说,你的模型应该只有getter和setter,可能还有一两个辅助函数来操作模型中的数据。
如果您有一个查询需要连接来自多个表的数据,并且可能包含一个或多个模型,或者一个模型的一部分和另一个模型的一部分,您可以只返回一个数组而不是模型对象,但这仍然会在映射器中完成。在我的一些应用程序中,这两种情况都有实例。
另外,我从基类扩展了我的模型,基类为我提供了一种简单的方法来获取数据数组并从数组中设置模型的属性。此外,它们还包含一个toArray方法,因此如果需要,我可以轻松地将模型转换为数组。
(快速回答)
我可以这样做:
$oMyGroup->addUser( $oMyUser );
您正在将用户添加到组中,无论您将使用何种策略在某些类型的数据"存储"中持久化/物化对象(datamapper, activerecord等):数据库,文本文件中的序列化对象,内存存储等