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