V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mateor95
V2EX  ›  PHP

实习程序员用世界上最好的语言造了一个 ORM 轮子

  •  
  •   mateor95 · 2017-01-03 16:10:51 +08:00 · 8720 次点击
    这是一个创建于 2910 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题目所述,

    • 轮子仅用于数据表内的 CURD 操作,不涉及数据表以及数据库的操作;
    • 无过滤

    请诸位大大帮我看看

    项目地址: https://github.com/mateor95/ORM

    文档地址: https://mateor.me/archives/61

    第 1 条附言  ·  2017-01-03 16:50:55 +08:00
    诸位大大的关注点都在于这货不像个 ORM

    这个轮子本意是造成 ORM 的,但是后来做项目的时候越改越像一个操作类了:)

    这个操作类用于实现 ORM 时,用一个实体类 extends ,然后重载魔术方法即可

    `
    public function __call($action, $parm) {
    $test = $this->$action( $parm );
    return $this;
    }
    `
    第 2 条附言  ·  2017-01-03 16:53:20 +08:00
    难道各位大大之中没有人觉得 ORM 的操作太麻烦了吗?任何一个库都要重新定义实体类?
    74 条回复    2017-01-10 18:15:45 +08:00
    Jakesoft
        1
    Jakesoft  
       2017-01-03 16:23:59 +08:00   ❤️ 2
    楼主需要先理解什么是 ORM
    baiyi
        2
    baiyi  
       2017-01-03 16:24:43 +08:00   ❤️ 1
    我原先也试图造过这一类的轮子,想弄个小框架出来,然后半路用上了 laravel......
    yzhen123
        3
    yzhen123  
       2017-01-03 16:25:33 +08:00   ❤️ 1
    这只能叫做 数据库操作工具类。。
    ivvei
        4
    ivvei  
       2017-01-03 16:28:46 +08:00   ❤️ 1
    这个不是 ORM ……
    baiyi
        5
    baiyi  
       2017-01-03 16:29:14 +08:00
    @yzhen123 laravel 里叫 查询构造器
    dwood
        6
    dwood  
       2017-01-03 16:29:32 +08:00   ❤️ 1
    ORM 即 Object Relation Mapping 的简写,指的是“对象关系映射”。对象在哪里?
    gino86
        7
    gino86  
       2017-01-03 16:31:40 +08:00
    这个时候是不是应该有人来推荐 symfony 的 doctrine
    a591826944
        8
    a591826944  
       2017-01-03 16:32:15 +08:00
    将对象属性映射到数据库字段,才是 ORM 的套路
    更改属性值, save 即更改数据库值,一切都在操作对象
    Lucups
        9
    Lucups  
       2017-01-03 16:32:36 +08:00
    看成了"造了一个最好的 ORM 轮子",所以特意点进来围观的。。。

    1 楼说得对,楼主需要先理解什么是 ORM 。。。
    kongkongyzt
        10
    kongkongyzt  
       2017-01-03 16:36:08 +08:00 via Android
    你还没明白什么是 ORM 。。。
    murmur
        11
    murmur  
       2017-01-03 16:40:53 +08:00
    说句不好听的,没有 SQL 过滤的话这东西连 shit 都不如,连手写 sql 的 mybatis 默认都带关键字过滤
    无过滤连 util 都称不上
    因为 php 的 pdo 都支持 sql 预编译和关键字过滤了
    murmur
        12
    murmur  
       2017-01-03 16:47:41 +08:00
    补充一点,当年 thinkphp 被人批判一番的原因,其中一点就是放着 php 自带的 pdo 不用,自己实现了一套 sql 转义和过滤,结果被人大抓漏洞
    总有新人不信邪,想自己搞个大新闻,最后还是 naive
    啥时候程序员才能改掉动不动就想造个轮子的习惯呢。。
    yangff
        13
    yangff  
       2017-01-03 16:49:42 +08:00
    @murmur 话不能这么说,谁能造个好用的 v8 的轮子给窝,我会很开心的
    subpo
        14
    subpo  
       2017-01-03 16:50:03 +08:00
    @murmur 为啥要改,就算写的不好,楼主的下一份工资也因为这个至少加了 200
    murmur
        15
    murmur  
       2017-01-03 16:51:56 +08:00
    @yangff v8 的竞品不就蜘蛛猴子和原来的三叉戟引擎现在不知道叫啥了。。这轮子一个人能造出来么
    wyntergreg
        16
    wyntergreg  
       2017-01-03 16:52:26 +08:00
    然而 ORM 本身就是 shit ,楼主的数据库操作类才是实用的好东西
    mateor95
        17
    mateor95  
    OP
       2017-01-03 16:52:34 +08:00
    @murmur 个人项目用自己的轮子撸着玩,成型项目还是用 laravel 撸呀
    mateor95
        18
    mateor95  
    OP
       2017-01-03 16:54:57 +08:00
    @subpo 谢大大哈哈哈,目前大三上学期,还没有工作,等找工作一定写上( ORM 轮子 +200 金)
    murmur
        19
    murmur  
       2017-01-03 16:55:05 +08:00
    @subpo 最重要的安全部分没实现,不想自己实现也没关系,为什么不在 pdo 上做呢,我看他用了 pdo 的 excute ,但是是手拼参数真的一点过滤没有
    新人有时候还是打击一下比较好
    我以前自己魔改别的前端框架,改了将近 200k 的定制代码,加了一大堆定制功能,虽然 bug 都改完了,后来,发现还是别人写的好,稍微一点风吹草动别人的啥事没有,参数检查什么妥妥的扛过去,自己写的就开始报错了
    翅膀没硬就不要学飞么,是不是这个道理
    yangff
        20
    yangff  
       2017-01-03 16:56:13 +08:00
    @murmur 窝是说 https://github.com/pmed/v8pp 这样的……
    虽然这个已经满好用了(和直接用 v8 比起来),但是用来做 embedded 还是挺蛋疼的……
    murmur
        21
    murmur  
       2017-01-03 16:57:01 +08:00
    @wyntergreg 我知道 php 界喜欢自己从 0 开始造框架,但是要知道项目越大越需要 orm 框架保证代码的规范和可读性
    如果按照现在的风气,小项目上什么 mysql ,用 mongo 不就好了么
    mybatis 都到现在还被批判,就是因为 orm 实现的不彻底,每一行 sql 都要自己去写
    mateor95
        22
    mateor95  
    OP
       2017-01-03 16:58:39 +08:00
    @murmur 轮子预留了过滤空间的,所有 SQL 执行之前都是会先执行 checkParam (),之所以用 pdo 但是却不用 pdo 的过滤,是因为考虑到换库或者跨库的时候可能用的不是 MYSQL
    Charkey
        23
    Charkey  
       2017-01-03 16:59:46 +08:00
    mybatis 是有点麻烦,任何一个库都要重新定义实体类?不需要,使用代码生成。
    mateor95
        24
    mateor95  
    OP
       2017-01-03 17:01:16 +08:00
    @Charkey 原来我一直 ORM 的用法用错了...
    murmur
        25
    murmur  
       2017-01-03 17:01:42 +08:00
    @mateor95 哦那不错哦,连这点都考虑到了,但是我印象中 php<5.4 的时候似乎是有本地过滤的 bug (对于 gbk 编码?年代久远记不清了,我那时候还用的 php5.2 ),必须通过配置强制转到 mysql 上做参数处理
    现在这个 bug 早改了吧, pdo 新版不能对所有数据库用统一的参数过滤么
    mateor95
        26
    mateor95  
    OP
       2017-01-03 17:03:24 +08:00
    @murmur 啊,这个我不清楚啊,我接触 PHP 的时候版本已经 5.6 了...
    murmur
        27
    murmur  
       2017-01-03 17:05:43 +08:00
    实体类有个好处就是 对于 java 这种语言 他拿掉 bean 之后 直接打一个.就知道里面有什么字段了 每种字段也带了类型 这个从数据库读数据可以强转 反过来从前端接数据也可以做过滤和校验操作
    更彻底一点,接口中带上 bean ,用接口的人也知道该传啥玩意进来,要不现在为啥 ts 都跟着凑热闹搞强类型
    要不为啥会有 bean validatition 这些东西
    java 风雨中走来 一路被批判 从未倒下 这些设定不是白做的
    RE
        28
    RE  
       2017-01-03 17:07:53 +08:00   ❤️ 1
    楼主可以看看 medoo - http://medoo.in/
    jhdxr
        29
    jhdxr  
       2017-01-03 17:08:37 +08:00
    @mateor95 PDO 又不是和 mysql 绑定的: http://php.net/manual/zh/intro.pdo.php 『 PDO 提供了一个 数据访问 抽象层』
    mateor95
        30
    mateor95  
    OP
       2017-01-03 17:10:54 +08:00
    @RE 感谢大大
    Kilerd
        31
    Kilerd  
       2017-01-03 17:11:21 +08:00
    naive
    1 、不懂什么是 ORM , 居然还在博客里面写了 ORM 的介绍。 6666
    2 、就想问问,你的 sql 从来没用过 OR ?? 你的 where 只能用 AND 相连???
    mateor95
        32
    mateor95  
    OP
       2017-01-03 17:12:43 +08:00
    @Kilerd 好像是这么回事,我研究下怎么改
    RE
        33
    RE  
       2017-01-03 17:14:55 +08:00
    @mateor95

    过奖了 :)
    就是觉得楼主这东西既然不是完整的 orm ,那跟这个 medoo 还挺像的,大概可以描述为 “数据库对象式操作类” 吧,这个 medoo 很轻很好用,我在很多微型 app 中直接用的,据说是开发团队用于从 https://catfan.me/ 这个项目中剥离出来的。
    hekunhotmail
        34
    hekunhotmail  
       2017-01-03 17:42:00 +08:00
    果然是最好的语言
    q397064399
        35
    q397064399  
       2017-01-03 18:16:32 +08:00
    话说 PHP 有反射了么?没有反射 ORM 个鸡巴啊, Java 的 ORM 是直接告诉框架 我这里有个实体类,
    框架你自己看着办,给老子反射一下吧 自动映射字段
    q397064399
        36
    q397064399  
       2017-01-03 18:19:50 +08:00
    你要是用过 Hibernate 等 Java 重型 ORM 框架就知道了,
    这些类,只要 在字段上做好了 @声明, ORM 框架会自动根据
    实体类之间的映射关系 生成 SQL 而且基本的增删改查都不用自己写,
    框架给你自动生成了 最原始的十几种增删改查

    而这些玩意的实现都依赖反射技术, php 如果没有反射,自然没有 ORM 一说
    kankana
        37
    kankana  
       2017-01-03 18:35:05 +08:00 via iPhone
    @q397064399 php 有反射。
    doctrine 就有你说的,字段注解……
    jarlyyn
        38
    jarlyyn  
       2017-01-03 18:49:21 +08:00
    @q397064399

    连 Js 都有 orm 了,为什么 Php 会没有。

    java 需要 orm 需要反射是 java 自己的问题,和其他语言没关系。

    要是你看了 js 的类是什么东西,你还不得懵逼了……
    greatonce
        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 ,就开始装逼了,结果失败了。
    murmur
        40
    murmur  
       2017-01-03 18:52:08 +08:00
    @greatonce 厉害了,真的是世界上最好的语言
    incompatible
        41
    incompatible  
       2017-01-03 19:10:47 +08:00 via iPhone
    @q397064399 估计你对 Java 和 Hibernate 也不怎么了解。早期的 Hibernate 是需要手写 mapping schema 的,完全不需要反射。
    sampeng
        42
    sampeng  
       2017-01-03 19:25:09 +08:00
    先学会走再去跑。。。我承认我也是看标题进来的
    BigDipper7
        43
    BigDipper7  
       2017-01-03 20:28:33 +08:00
    😅尴尬,我也是堪称了最好的 ORM 框架,吓得我点进来了 - -
    emlcj
        44
    emlcj  
       2017-01-03 21:02:31 +08:00
    这里贴一个没有反射的 C++ 实现 ORM 的例子,不过很糙 --> https://lcj.me/cde-modellei-shi-xian/
    zpvip
        45
    zpvip  
       2017-01-03 21:48:23 +08:00
    我觉得楼主开个帖挺值的,在各位老师的帮助下,水平一下就提高了
    mateor95
        46
    mateor95  
    OP
       2017-01-03 22:12:21 +08:00
    @zpvip 正是此意
    qiukun
        47
    qiukun  
       2017-01-03 23:09:16 +08:00
    @emlcj 这就是反射。然后 relation 给你吃了?
    roist
        48
    roist  
       2017-01-03 23:39:43 +08:00
    “造轮子”这个词算是不当翻译的一个模范了,“发明滚轮” 才是最准确的翻译
    cuebyte
        49
    cuebyte  
       2017-01-04 01:59:52 +08:00
    只有我在意没有类型检查么……

    没有 schema 的 ORM 和咸鱼有什么区别?楼主你改成 mongo 的 ORM 算了
    cuebyte
        50
    cuebyte  
       2017-01-04 02:01:39 +08:00
    @q397064399 去看看 ORM 的鼻祖 ActiveRecord 吧,我谢谢您了。
    cuebyte
        51
    cuebyte  
       2017-01-04 02:03:16 +08:00
    @q397064399 不想看 ruby 也可以看 laravel 或 django 的 ORM
    cuebyte
        52
    cuebyte  
       2017-01-04 02:08:56 +08:00
    楼主可能做的项目比较不规范,很多表?

    一个表一个实体类已经很轻松啦。数据库不也得 create table 各种定义么。

    知足吧,某语言的 ORM 们,要定义类,要自己写 repository ,要写 xml ,还可能要在代码里写 sql 。

    当然 JPA 还是很好的。
    yegle
        53
    yegle  
       2017-01-04 02:40:53 +08:00
    字符串拼接哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
    msg7086
        54
    msg7086  
       2017-01-04 07:04:54 +08:00
    "任何一个库都要重新定义实体类?"

    > 去看一下 Ruby on Rails 吧。
    murmur
        55
    murmur  
       2017-01-04 08:06:11 +08:00
    @cuebyte 手写 sql 是一种情怀,要不为啥 mybatis 现在能火,给我 sql 模板给我字段过滤就敢干活了
    q397064399
        56
    q397064399  
       2017-01-04 08:22:46 +08:00
    @greatonce
    @cuebyte

    不管 xx , orm 的本质是告诉 框架一些信息,然后让框架帮我们去做一些重复又脏累的工作,
    如果我 xx 还要自己拼接 sql ,或者让库来拼接 sql
    如果简单的增删改查什么的,都得自己来映射结果集与对象 还要 orm 框架干吊?我自己手撸不行?
    Mybatis 只解决了一部的问题,但是把查询方式暴露了出来,
    你们知道 JPA 标准是可以直接写接口定义 让框架来代理实现的么?简单的博客之类的业务逻辑
    我可以一行 sql 都不写就完成,连分页都不用写了,框架全给你做好,你只管定义接口就行
    sagaxu
        57
    sagaxu  
       2017-01-04 08:34:04 +08:00 via Android
    自从有了 spring boot 和 idea , java 撸 web 比 PHP 还方便
    samtoto
        58
    samtoto  
       2017-01-04 08:53:05 +08:00
    chuanqirenwu
        59
    chuanqirenwu  
       2017-01-04 09:53:35 +08:00 via iPhone
    Javascript 才是世界上最好的语言。浏览器端就不说了,写数据库,写编译器,写 web 框架,写爬虫没有不能做的。
    r00tt
        60
    r00tt  
       2017-01-04 11:04:21 +08:00 via iPhone
    Orm 还是看看 ActiveRecord 吧
    breeswish
        61
    breeswish  
       2017-01-04 11:17:25 +08:00
    楼主写了一个 SQL Statement Builder
    接下来还需努力,才可以造出一个 ORM
    mateor95
        62
    mateor95  
    OP
       2017-01-04 11:18:02 +08:00
    @breeswish 出现了一个温和的程序员...
    mateor95
        63
    mateor95  
    OP
       2017-01-04 11:30:51 +08:00
    @cuebyte 类型检查指的是什么?
    Sendya
        64
    Sendya  
       2017-01-04 11:36:55 +08:00
    fuxkcsdn
        65
    fuxkcsdn  
       2017-01-04 11:47:07 +08:00   ❤️ 1
    LZ , 5 铜币收好,刚出来工作不要怕,被喷才有提升空间
    等工作个 2 、 3 年你再回头来看这帖,你会感激喷你的人,然而...这帖也会是你很想让其消失在网络上的帖

    BTW , V2EX 上木有删帖功能!
    mateor95
        66
    mateor95  
    OP
       2017-01-04 11:57:08 +08:00
    @fuxkcsdn 看来是有相同经历的人啊
    msg7086
        67
    msg7086  
       2017-01-04 12:13:10 +08:00
    @mateor95 大家都是这么爬上来的。
    cuebyte
        68
    cuebyte  
       2017-01-04 15:40:19 +08:00
    @msg7086 ActiveRecord 不过是把 schema 放在了 migration 的信息里,我还觉得不方便查看呢。
    msg7086
        69
    msg7086  
       2017-01-04 16:10:51 +08:00
    @cuebyte 没记错的话 schema 是 migration 用的。 ActiveRecord 本身不依赖 migration 和 schema 。
    yangxin0
        70
    yangxin0  
       2017-01-04 16:17:11 +08:00
    楼主可以参考一下 ActiveRecord
    realpg
        71
    realpg  
       2017-01-04 16:46:05 +08:00
    @q397064399
    JAVA 党总是这样 呵呵呵呵
    raincious
        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 开始造框架,我就是喜欢这样怎么地了。
    xpresslink
        73
    xpresslink  
       2017-01-06 11:12:29 +08:00
    对象关系映射(英语: Object Relation Mapping ,简称 ORM ,或 O/RM ,或 O/R mapping ),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换[1] 。从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库”。

    PHP 本身对面向对象的支持就是半吊子
    cncqw
        74
    cncqw  
       2017-01-10 18:15:45 +08:00
    这个真不是 ORM ,只是用函数拼成简单的 sql 语句,文档还写得有模有样的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5991 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 02:04 · PVG 10:04 · LAX 18:04 · JFK 21:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.