PHP 有没有必要使用 ORM?如果使用的话大家有什么好推荐的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
codegeek
V2EX    PHP

PHP 有没有必要使用 ORM?如果使用的话大家有什么好推荐的?

  •  
  •   codegeek 2015-06-15 22:02:26 +08:00 14404 次点击
    这是一个创建于 3822 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在开发的一个项目都是手写SQL,感觉很繁琐啊;

    想用orm,但是有的观点是orm不灵活,而且效率不高;

    这方面有实际经验的小伙伴给个意见吧。

    36 条回复    2019-08-17 11:47:02 +08:00
    cevincheung
        1
    cevincheung  
       2015-06-15 22:10:42 +08:00
    手写sql
    自己封装一些常用的join、insert、update、delete就好了。
    lbp0200
        2
    lbp0200  
       2015-06-15 22:29:18 +08:00 via Android
    laravel里面有,挺方便的
    abelyao
        3
    abelyao  
       2015-06-15 23:15:30 +08:00 via iPhone
    如果用框架的话,一般都自带 ORM 了。
    或者楼主可以搜一个叫 medoo 的类库,封装了 SQL 的操作,挺方便的。
    mcfog
        4
    mcfog  
       2015-06-15 23:32:12 +08:00 via Android
    看你有多少队友,队友的平均&最低战斗力,以及项目打算维护多久决定了

    我个人来说是极其讨厌
    mcfog
        5
    mcfog  
       2015-06-15 23:33:30 +08:00 via Android
    (续)极其讨厌手写sql的,至少也会弄个类似NotORM的dbal来屏蔽sql这件事
    lincanbin
        6
    lincanbin  
       2015-06-16 00:32:03 +08:00   1
    我倒是非常喜欢手写SQL,组装的黑盒看不见里面总是不太高兴。
    SQL并不复杂,最多也就十几二十行,也就直接写了。
    Septembers
        7
    Septembers  
       2015-06-16 02:02:49 +08:00 via Android
    @lincanbin ORM细节不可控,有些意想不到问题就来自这些细节
    yegle
        8
    yegle  
       2015-06-16 03:23:40 +08:00
    手写哈哈哈哈等着被注入吧。好歹绑定个变量啊
    hgc81538
        9
    hgc81538  
       2015-06-16 03:34:57 +08:00 via iPhone
    mahone3297
        10
    mahone3297  
       2015-06-16 07:08:21 +08:00
    有必要,doctrine
    lincanbin
        11
    lincanbin  
       2015-06-16 07:40:40 +08:00 via Android
    @yegle 手写不意味着不做参数绑定。
    yakczh
        12
    yakczh  
       2015-06-16 07:57:09 +08:00
    @mcfog notOrm 对数据库主键定义有约束
    weer0026
        13
    weer0026  
       2015-06-16 08:19:25 +08:00
    用ORM主要是喜欢它可以通过查询取出对象数组。
    c060604
        14
    c060604  
       2015-06-16 08:58:14 +08:00
    orm开发效率高 找些成熟的类库就没什么多大问题
    yangmls
        15
    yangmls  
       2015-06-16 09:02:50 +08:00
    @lincanbin 字段和库更名了,手写改起来就很蛋疼

    不过 ORM 也可以手写 SQL,比如 Yii 就提供过 findBySql 这样的玩意

    不过就算不用 ORM,我感觉 query builder 也是更好的选择
    yakczh
        16
    yakczh  
       2015-06-16 09:07:13 +08:00
    如果用json把sql参数写成配置文件, 就不用写拼字符串了,也不用改代码,这种方式可行吗?
    tabris17
        17
    tabris17  
       2015-06-16 09:08:56 +08:00
    PHP的ORM非常弱逼。也就Phalcon的ORM支持PHQL还凑合
    66beta
        18
    66beta  
       2015-06-16 09:44:41 +08:00
    Laravel Eloquent
    mhycy
        19
    mhycy  
       2015-06-16 09:52:11 +08:00
    用PDO一直都不用拼接字符串。。
    原生支持参数化查询,包装一下就好了
    lujiajing1126
        20
    lujiajing1126  
       2015-06-16 09:57:48 +08:00
    Doctrine
    Agromania
        21
    Agromania  
       2015-06-16 11:13:43 +08:00
    Doctrine or Eloquent

    手写sql。。。等着被注入吧+1
    wingoo
        22
    wingoo  
       2015-06-16 11:33:13 +08:00
    gDD
        23
    gDD  
       2015-06-16 12:16:08 +08:00 via iPhone
    @Agromania 手写不代表会被注入。参数绑定和手写SQL并不冲突。
    fangjinmin
        24
    fangjinmin  
       2015-06-16 12:30:08 +08:00
    ORM不好对SQL优化。还是直接用SQL比较好。
    xujif
        25
    xujif  
       2015-06-16 13:32:21 +08:00
    orm开发,sql优化。为接口编程。
    TangMonk
        26
    TangMonk  
       2015-06-16 13:38:04 +08:00
    Doctrine
    ywisax
        27
    ywisax  
       2015-06-16 14:25:28 +08:00
    长期维护的项目,牺牲一定灵活性和运行效率来换取 编码效率是值得的,我认为有必要用orm。
    php中的orm一般都是做sql拼凑、参数过滤和绑定、部分有缓存功能或query builder,设计得好的话,可以让代码逻辑更加优美。
    框架推荐的话,大型的推荐doctrine/orm,微型的有redbean,适中的有PhpActiveRecord。对个人来说,用得最舒服的orm类库,是yii2的ActiveRecord和kohana的orm module。
    danial
        28
    danial  
       2015-06-16 15:09:28 +08:00
    绝对需要。
    推荐是Doctrine/ORM,lavarel目前还没用过,不做评价。
    bearzk
        29
    bearzk  
       2015-06-16 15:46:48 +08:00
    推荐同事写的 https://github.com/ihabunek/phormium
    虽然他说了 'test before use' 但是其实我们的production api已经在用这个了 :)
    hildert
        30
    hildert  
       2015-06-16 16:24:17 +08:00
    Doctrine
    timsims
        31
    timsims  
       2015-06-16 16:28:04 +08:00
    ORM不灵活这观点从何而来,正因为手写SQL太繁琐才需要ORM

    目前用Laravel Eloquent
    Agromania
        32
    Agromania  
       2015-06-17 11:07:15 +08:00
    @gDD 当然,orm本身都是手写的。但是何必又写一遍呢?一定能做得比别人更尽善尽美吗?
    gDD
        33
    gDD  
       2015-06-17 11:50:36 +08:00
    @Agromania 我的回复里既没有推崇手写 SQL 也没有推崇重造一个 ORM 出来,那么后面两个问号就不是针对我的。另外 ORM 的代码确实是手写出来,但这和本帖的主题「手写 SQL 语句」是两个概念啊。*当然*,手写 SQL 语句不代表会被注入。
    mingyun
        34
    mingyun  
       2015-06-22 00:14:45 +08:00
    @timsims 同推荐
    infatu8
        35
    infatu8  
       2019-08-17 11:44:03 +08:00
    长远考虑,必须手写啊
    直接用 pdo,或在 pdo 的基础之上做简单的封装即可
    什么 orm 都是浮云,当项目越做越大,最后你会发现,你之前用 orm 做的 db 操作 一半都要优化成手写 sql
    另外,手写 sql 不代表着会被注入,凡是认为手写 sql 就会被注入的,证明你功力还不够,基础不行
    infatu8
        36
    infatu8  
       2019-08-17 11:47:02 +08:00
    补充:
    手写 sql 并把相关方法放到模型里去,这样有助于理解什么是模型
    orm 让很多新人误解了模型的概念
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4069 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 04:11 PVG 12:11 LAX 20:11 JFK 23:11
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86