mateor95
V2EX  ›  PHP

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

  •  
  •   mateor95 · Jan 3, 2017 · 9541 views
    This topic created in 3431 days ago, the information mentioned may be changed or developed.

    如题目所述,

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

    请诸位大大帮我看看

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

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

    Supplement 1  ·  Jan 3, 2017
    诸位大大的关注点都在于这货不像个 ORM

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

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

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

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

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

    而这些玩意的实现都依赖反射技术, php 如果没有反射,自然没有 ORM 一说
    kankana
        37
    kankana  
       Jan 3, 2017 via iPhone
    @q397064399 php 有反射。
    doctrine 就有你说的,字段注解……
    jarlyyn
        38
    jarlyyn  
       Jan 3, 2017
    @q397064399

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

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

    要是你看了 js 的类是什么东西,你还不得懵逼了……
    greatonce
        39
    greatonce  
       Jan 3, 2017
    @q397064399 PHP 有反射 http://php.net/manual/en/book.reflection.php

    估计你也对 PHP 不了解,另外 ORM 不一定要反射模型,也可以通过解析 schema 的方式做。

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

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

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

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

    当然 JPA 还是很好的。
    yegle
        53
    yegle  
       Jan 4, 2017
    字符串拼接哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
    msg7086
        54
    msg7086  
       Jan 4, 2017
    "任何一个库都要重新定义实体类?"

    > 去看一下 Ruby on Rails 吧。
    murmur
        55
    murmur  
       Jan 4, 2017
    @cuebyte 手写 sql 是一种情怀,要不为啥 mybatis 现在能火,给我 sql 模板给我字段过滤就敢干活了
    q397064399
        56
    q397064399  
       Jan 4, 2017
    @greatonce
    @cuebyte

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

    BTW , V2EX 上木有删帖功能!
    mateor95
        66
    mateor95  
    OP
       Jan 4, 2017
    @fuxkcsdn 看来是有相同经历的人啊
    msg7086
        67
    msg7086  
       Jan 4, 2017
    @mateor95 大家都是这么爬上来的。
    cuebyte
        68
    cuebyte  
       Jan 4, 2017
    @msg7086 ActiveRecord 不过是把 schema 放在了 migration 的信息里,我还觉得不方便查看呢。
    msg7086
        69
    msg7086  
       Jan 4, 2017
    @cuebyte 没记错的话 schema 是 migration 用的。 ActiveRecord 本身不依赖 migration 和 schema 。
    yangxin0
        70
    yangxin0  
       Jan 4, 2017
    楼主可以参考一下 ActiveRecord
    realpg
        71
    realpg  
    PRO
       Jan 4, 2017
    @q397064399
    JAVA 党总是这样 呵呵呵呵
    raincious
        72
    raincious  
       Jan 4, 2017
    还好啦楼主,你被喷的不惨。我被喷的才惨,还被喷了好几次,看我刚注册的时候发的帖子就知道了,还好我脸皮厚,挺了过来。

    话说我也写过一个 ORM ,上次更新是 2015 年。不过哪怕按照当年的标准都是很烂的,拿过去当反例吧:
    https://github.com/raincious/facula/blob/master/src/Facula/Unit/SimpleORM/ORM.php

    // 话说层主我也喜欢从 0 开始造框架,我就是喜欢这样怎么地了。
    xpresslink
        73
    xpresslink  
       Jan 6, 2017
    对象关系映射(英语: Object Relation Mapping ,简称 ORM ,或 O/RM ,或 O/R mapping ),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换[1] 。从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库”。

    PHP 本身对面向对象的支持就是半吊子
    cncqw
        74
    cncqw  
       Jan 10, 2017
    这个真不是 ORM ,只是用函数拼成简单的 sql 语句,文档还写得有模有样的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3183 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 111ms · UTC 12:37 · PVG 20:37 · LAX 05:37 · JFK 08:37
    ♥ Do have faith in what you're doing.