PHP MVC:Data Mapper模式:类设计
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了PHP MVC:Data Mapper模式:类设计,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3033字,纯文字阅读大概需要5分钟。
内容图文
![PHP MVC:Data Mapper模式:类设计](/upload/InfoBanner/zyjiaocheng/685/8846c01a70424ac890bb7c0b70a51411.jpg)
我有一个带有域对象和数据映射器的Web MVC应用程序.数据映射器的类方法包含所有数据库查询逻辑.我试图避免镜像任何数据库结构,因此,在构造sql语句时要获得最大的灵活性.因此,原则上,我试图不使用任何ORM或ActiveRecord结构/模式.
让我给你举个例子:
通常,我可以有一个抽象类AbstractDataMapper,它由所有特定的数据映射器类(如UserDataMapper类)继承.然后我可以在AbstractDataMapper中定义一个findById()方法,以给定的id值获取特定表(如用户)的记录,例如用户身份.但这意味着我将始终从单个表中获取一条记录,而不能使用任何左连接来从与给定ID-用户ID相对应的其他一些表中获取其他细节.
所以,我的问题是:
在这些条件下(我本人必须这样做),我应该实现一个抽象的数据映射器类,还是每个数据映射器类都应包含其自己的数据访问层的完全“专有”实现?
我希望我能表达清楚我的想法.如果我不清楚或您有任何疑问,请告诉我.
非常感谢您的时间和耐心.
解决方法:
如果我明白你的意思…
让所有具体的映射器从一个公共类继承SQL时,您会遗漏几个问题:
>域对象中的参数名称取决于列的名称
>映射器中有一个“获取方法”,没有对应的表
>您仍然具有超类所期望的配置(表名)
>数据库模式必须将ID作为所有PRIMARY KEY列的名称
现在,我将尝试解开每个包装.
参数和列名
要创建共享的findById()方法,唯一实用的方法是围绕类似以下的内容进行构建:
"SELECT * FROM {$this->tableName} WHERE id = :id"
实际上,主要问题是通配符*符号.
使用数据映射器填充实体的主要方法有两种:使用设置器或使用反射.在这两种情况下,您选择的列都隐含了参数/设置器的“名称”.
在普通查询中,您可以执行诸如SELECT name AS fullName FROM …之类的操作,它使您可以使用查询来重命名字段.但是,采用“统一方法”,没有好的选择.
每个映射器都可以按ID提取数据吗?
因此,关键是,除非您具有每个表一个映射器的结构(在这种情况下,活动记录开始看起来像务实的选择),否则最终将为映射器带来几种(真正常见的)“边缘情况”方案:
>仅用于保存数据
>处理集合而不是单个实体
>汇总来自多个表的数据
>使用具有复合键的表
>实际上不是表,而是SQL视图
> …或上述各项的组合
您最初的想法在一个小型项目中会很好用(一个或两个映射器是“边缘情况”).但是对于大型项目,使用findById()将是一个例外,而不是常规情况.
独立育儿?
要在超类中实际获得此findById()方法,您将需要一种与表名进行通信的方法.这意味着,您在类定义中具有诸如protected $tableName之类的内容.
您可以通过在抽象映射器类中具有抽象函数getTableName()来缓解这种情况,该抽象函数在实现时将返回全局常数的值.
但是,当您的映射器需要使用多个表时,会发生什么.
在我看来,这似乎是一种代码气味,因为信息实际上跨越了两个边界(因为缺少更好的用词).当此代码中断时,将在超类中显示SQL的错误,而不是错误的起源(特别是如果使用常量的话).
命名主键
这是更具争议性的观点:)
据我所知,调用所有主列id的做法来自各种ORM.产生的惩罚仅适用于可读性(和代码维护).考虑以下两个查询:
SELECT ar.id, ac.id
FROM Articles AS ar LEFT JOIN
Accounts AS ac ON ac.id = ar.account_id
WHERE ar.status = 'published'
SELECT ar.article_id, ac.account_id
FROM Articles AS ar LEFT JOIN
Accounts AS ac USING(account_id)
WHERE ar.status = 'published'
随着数据库模式的增长和查询的变得越来越复杂,实际跟踪“ id”在什么情况下代表什么变得越来越困难.
我的建议是,当列是主键时还是外键,请尝试使用相同的名称(可能的话,因为在某些情况下,例如“闭表”,它是不可行的.)基本上,所有存储ID的列相同类型的名称应相同.
作为次要好处,您可以获得USING()语法糖.
TL; DR
馊主意.您基本上打破了LSP.
内容总结
以上是互联网集市为您收集整理的PHP MVC:Data Mapper模式:类设计全部内容,希望文章能够帮你解决PHP MVC:Data Mapper模式:类设计所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。