1
Jakesoft 2017-01-03 16:23:59 +08:00 2
楼主需要先理解什么是 ORM
|
2
baiyi 2017-01-03 16:24:43 +08:00 1
我原先也试图造过这一类的轮子,想弄个小框架出来,然后半路用上了 laravel......
|
3
yzhen123 2017-01-03 16:25:33 +08:00 1
这只能叫做 数据库操作工具类。。
|
4
ivvei 2017-01-03 16:28:46 +08:00 1
这个不是 ORM ……
|
6
dwood 2017-01-03 16:29:32 +08:00 1
ORM 即 Object Relation Mapping 的简写,指的是“对象关系映射”。对象在哪里?
|
7
gino86 2017-01-03 16:31:40 +08:00
这个时候是不是应该有人来推荐 symfony 的 doctrine
|
8
a591826944 2017-01-03 16:32:15 +08:00
将对象属性映射到数据库字段,才是 ORM 的套路
更改属性值, save 即更改数据库值,一切都在操作对象 |
9
Lucups 2017-01-03 16:32:36 +08:00
看成了"造了一个最好的 ORM 轮子",所以特意点进来围观的。。。
1 楼说得对,楼主需要先理解什么是 ORM 。。。 |
10
kongkongyzt 2017-01-03 16:36:08 +08:00 via Android
你还没明白什么是 ORM 。。。
|
11
murmur 2017-01-03 16:40:53 +08:00
说句不好听的,没有 SQL 过滤的话这东西连 shit 都不如,连手写 sql 的 mybatis 默认都带关键字过滤
无过滤连 util 都称不上 因为 php 的 pdo 都支持 sql 预编译和关键字过滤了 |
12
murmur 2017-01-03 16:47:41 +08:00
补充一点,当年 thinkphp 被人批判一番的原因,其中一点就是放着 php 自带的 pdo 不用,自己实现了一套 sql 转义和过滤,结果被人大抓漏洞
总有新人不信邪,想自己搞个大新闻,最后还是 naive 啥时候程序员才能改掉动不动就想造个轮子的习惯呢。。 |
16
wyntergreg 2017-01-03 16:52:26 +08:00
然而 ORM 本身就是 shit ,楼主的数据库操作类才是实用的好东西
|
19
murmur 2017-01-03 16:55:05 +08:00
@subpo 最重要的安全部分没实现,不想自己实现也没关系,为什么不在 pdo 上做呢,我看他用了 pdo 的 excute ,但是是手拼参数真的一点过滤没有
新人有时候还是打击一下比较好 我以前自己魔改别的前端框架,改了将近 200k 的定制代码,加了一大堆定制功能,虽然 bug 都改完了,后来,发现还是别人写的好,稍微一点风吹草动别人的啥事没有,参数检查什么妥妥的扛过去,自己写的就开始报错了 翅膀没硬就不要学飞么,是不是这个道理 |
20
yangff 2017-01-03 16:56:13 +08:00
|
21
murmur 2017-01-03 16:57:01 +08:00
@wyntergreg 我知道 php 界喜欢自己从 0 开始造框架,但是要知道项目越大越需要 orm 框架保证代码的规范和可读性
如果按照现在的风气,小项目上什么 mysql ,用 mongo 不就好了么 mybatis 都到现在还被批判,就是因为 orm 实现的不彻底,每一行 sql 都要自己去写 |
22
mateor95 OP @murmur 轮子预留了过滤空间的,所有 SQL 执行之前都是会先执行 checkParam (),之所以用 pdo 但是却不用 pdo 的过滤,是因为考虑到换库或者跨库的时候可能用的不是 MYSQL
|
23
Charkey 2017-01-03 16:59:46 +08:00
mybatis 是有点麻烦,任何一个库都要重新定义实体类?不需要,使用代码生成。
|
25
murmur 2017-01-03 17:01:42 +08:00
@mateor95 哦那不错哦,连这点都考虑到了,但是我印象中 php<5.4 的时候似乎是有本地过滤的 bug (对于 gbk 编码?年代久远记不清了,我那时候还用的 php5.2 ),必须通过配置强制转到 mysql 上做参数处理
现在这个 bug 早改了吧, pdo 新版不能对所有数据库用统一的参数过滤么 |
27
murmur 2017-01-03 17:05:43 +08:00
实体类有个好处就是 对于 java 这种语言 他拿掉 bean 之后 直接打一个.就知道里面有什么字段了 每种字段也带了类型 这个从数据库读数据可以强转 反过来从前端接数据也可以做过滤和校验操作
更彻底一点,接口中带上 bean ,用接口的人也知道该传啥玩意进来,要不现在为啥 ts 都跟着凑热闹搞强类型 要不为啥会有 bean validatition 这些东西 java 风雨中走来 一路被批判 从未倒下 这些设定不是白做的 |
28
RE 2017-01-03 17:07:53 +08:00 1
楼主可以看看 medoo - http://medoo.in/
|
29
jhdxr 2017-01-03 17:08:37 +08:00
@mateor95 PDO 又不是和 mysql 绑定的: http://php.net/manual/zh/intro.pdo.php 『 PDO 提供了一个 数据访问 抽象层』
|
31
Kilerd 2017-01-03 17:11:21 +08:00
naive
1 、不懂什么是 ORM , 居然还在博客里面写了 ORM 的介绍。 6666 2 、就想问问,你的 sql 从来没用过 OR ?? 你的 where 只能用 AND 相连??? |
33
RE 2017-01-03 17:14:55 +08:00
@mateor95
过奖了 :) 就是觉得楼主这东西既然不是完整的 orm ,那跟这个 medoo 还挺像的,大概可以描述为 “数据库对象式操作类” 吧,这个 medoo 很轻很好用,我在很多微型 app 中直接用的,据说是开发团队用于从 https://catfan.me/ 这个项目中剥离出来的。 |
34
hekunhotmail 2017-01-03 17:42:00 +08:00
果然是最好的语言
|
35
q397064399 2017-01-03 18:16:32 +08:00
话说 PHP 有反射了么?没有反射 ORM 个鸡巴啊, Java 的 ORM 是直接告诉框架 我这里有个实体类,
框架你自己看着办,给老子反射一下吧 自动映射字段 |
36
q397064399 2017-01-03 18:19:50 +08:00
你要是用过 Hibernate 等 Java 重型 ORM 框架就知道了,
这些类,只要 在字段上做好了 @声明, ORM 框架会自动根据 实体类之间的映射关系 生成 SQL 而且基本的增删改查都不用自己写, 框架给你自动生成了 最原始的十几种增删改查 而这些玩意的实现都依赖反射技术, php 如果没有反射,自然没有 ORM 一说 |
37
kankana 2017-01-03 18:35:05 +08:00 via iPhone
@q397064399 php 有反射。
doctrine 就有你说的,字段注解…… |
38
jarlyyn 2017-01-03 18:49:21 +08:00
@q397064399
连 Js 都有 orm 了,为什么 Php 会没有。 java 需要 orm 需要反射是 java 自己的问题,和其他语言没关系。 要是你看了 js 的类是什么东西,你还不得懵逼了…… |
39
greatonce 2017-01-03 18:50:23 +08:00
@q397064399 PHP 有反射 http://php.net/manual/en/book.reflection.php
估计你也对 PHP 不了解,另外 ORM 不一定要反射模型,也可以通过解析 schema 的方式做。 楼主还没弄懂什么是 ORM , ODM , ActiveRecord , ModelRelation ,就开始装逼了,结果失败了。 |
41
incompatible 2017-01-03 19:10:47 +08:00 via iPhone
@q397064399 估计你对 Java 和 Hibernate 也不怎么了解。早期的 Hibernate 是需要手写 mapping schema 的,完全不需要反射。
|
42
sampeng 2017-01-03 19:25:09 +08:00
先学会走再去跑。。。我承认我也是看标题进来的
|
43
BigDipper7 2017-01-03 20:28:33 +08:00
😅尴尬,我也是堪称了最好的 ORM 框架,吓得我点进来了 - -
|
44
emlcj 2017-01-03 21:02:31 +08:00
这里贴一个没有反射的 C++ 实现 ORM 的例子,不过很糙 --> https://lcj.me/cde-modellei-shi-xian/
|
45
zpvip 2017-01-03 21:48:23 +08:00
我觉得楼主开个帖挺值的,在各位老师的帮助下,水平一下就提高了
|
48
roist 2017-01-03 23:39:43 +08:00
“造轮子”这个词算是不当翻译的一个模范了,“发明滚轮” 才是最准确的翻译
|
49
cuebyte 2017-01-04 01:59:52 +08:00
只有我在意没有类型检查么……
没有 schema 的 ORM 和咸鱼有什么区别?楼主你改成 mongo 的 ORM 算了 |
50
cuebyte 2017-01-04 02:01:39 +08:00
@q397064399 去看看 ORM 的鼻祖 ActiveRecord 吧,我谢谢您了。
|
51
cuebyte 2017-01-04 02:03:16 +08:00
@q397064399 不想看 ruby 也可以看 laravel 或 django 的 ORM
|
52
cuebyte 2017-01-04 02:08:56 +08:00
楼主可能做的项目比较不规范,很多表?
一个表一个实体类已经很轻松啦。数据库不也得 create table 各种定义么。 知足吧,某语言的 ORM 们,要定义类,要自己写 repository ,要写 xml ,还可能要在代码里写 sql 。 当然 JPA 还是很好的。 |
53
yegle 2017-01-04 02:40:53 +08:00
字符串拼接哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
|
54
msg7086 2017-01-04 07:04:54 +08:00
"任何一个库都要重新定义实体类?"
> 去看一下 Ruby on Rails 吧。 |
56
q397064399 2017-01-04 08:22:46 +08:00
|
57
sagaxu 2017-01-04 08:34:04 +08:00 via Android
自从有了 spring boot 和 idea , java 撸 web 比 PHP 还方便
|
58
samtoto 2017-01-04 08:53:05 +08:00
|
59
chuanqirenwu 2017-01-04 09:53:35 +08:00 via iPhone
Javascript 才是世界上最好的语言。浏览器端就不说了,写数据库,写编译器,写 web 框架,写爬虫没有不能做的。
|
60
r00tt 2017-01-04 11:04:21 +08:00 via iPhone
Orm 还是看看 ActiveRecord 吧
|
61
breeswish 2017-01-04 11:17:25 +08:00
楼主写了一个 SQL Statement Builder
接下来还需努力,才可以造出一个 ORM |
64
Sendya 2017-01-04 11:36:55 +08:00
|
65
fuxkcsdn 2017-01-04 11:47:07 +08:00 1
LZ , 5 铜币收好,刚出来工作不要怕,被喷才有提升空间
等工作个 2 、 3 年你再回头来看这帖,你会感激喷你的人,然而...这帖也会是你很想让其消失在网络上的帖 BTW , V2EX 上木有删帖功能! |
68
cuebyte 2017-01-04 15:40:19 +08:00
@msg7086 ActiveRecord 不过是把 schema 放在了 migration 的信息里,我还觉得不方便查看呢。
|
69
msg7086 2017-01-04 16:10:51 +08:00
@cuebyte 没记错的话 schema 是 migration 用的。 ActiveRecord 本身不依赖 migration 和 schema 。
|
70
yangxin0 2017-01-04 16:17:11 +08:00
楼主可以参考一下 ActiveRecord
|
71
realpg 2017-01-04 16:46:05 +08:00
@q397064399
JAVA 党总是这样 呵呵呵呵 |
72
raincious 2017-01-04 16:52:06 +08:00
还好啦楼主,你被喷的不惨。我被喷的才惨,还被喷了好几次,看我刚注册的时候发的帖子就知道了,还好我脸皮厚,挺了过来。
话说我也写过一个 ORM ,上次更新是 2015 年。不过哪怕按照当年的标准都是很烂的,拿过去当反例吧: https://github.com/raincious/facula/blob/master/src/Facula/Unit/SimpleORM/ORM.php // 话说层主我也喜欢从 0 开始造框架,我就是喜欢这样怎么地了。 |
73
xpresslink 2017-01-06 11:12:29 +08:00
对象关系映射(英语: Object Relation Mapping ,简称 ORM ,或 O/RM ,或 O/R mapping ),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换[1] 。从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库”。
PHP 本身对面向对象的支持就是半吊子 |
74
cncqw 2017-01-10 18:15:45 +08:00
这个真不是 ORM ,只是用函数拼成简单的 sql 语句,文档还写得有模有样的
|