V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
lml12377
V2EX  ›  问与答

thinkphp 对 sql 操作的疑问

  •  
  •   lml12377 · 2016-07-03 22:05:25 +08:00 · 1559 次点击
    这是一个创建于 3069 天前的主题,其中的信息可能已经有所发展或是发生改变。

    tp 里对数据库操作,比如:

    SELECT id, name FROM user WHERE id = 1 ORDER BY create_time DESC LIMIT 1

    会转换成类似这样的形式:

    M('user')->field('id, name')->where(array('id' => 1))->order(array('create_time' => 'DESC'))->limit('1');

    在不启用 ActiveRecord/ORM 的情况下,这么做的目的是不是通过连贯操作,将每个方法交给对应数据库驱动来实现,因为不同的数据库语句会有差异?(比如 limit/offset/rownum ),这样在切换驱动时保证原先 model 中的 sql 不需要重写?

    还有个小白的问题,既然 SQL 标准在那,为何不同数据库连基本语句都还有差异?

    还有 AR/ORM 实现的意义是什么?看到大家都争相实现,数据库本身就可以开启内存缓存查询结果,另外还有 redis/memcached 一大堆缓存工具,为何我要把记录映射成对象存到内存?另外并没有感觉到 get/set/add/save 用起来有多方便?还有跨表简直丧失。。。复杂的 sql 更别提了。。。这东西究竟有何意义?

    4 条回复    2016-07-04 09:30:05 +08:00
    kaner
        1
    kaner  
       2016-07-03 22:29:38 +08:00   ❤️ 1
    http://www.v2ex.com/t/288772
    优缺点都有,看你取舍。
    mitoop
        2
    mitoop  
       2016-07-04 00:05:51 +08:00   ❤️ 1
    连贯操作只是方便构建查询语句,TP 是,Laravel 也是,构建好的查询语句最终交给 DB 类执行,TP 数据库扩展是在 Driver 层扩展的, DB 下 Driver 基类定义了规则,不同实现在各自不同类中具体实现,见 DB\Driver 下的各种模型类 。 Laravel 构建语句更复杂一点功能也更强 Model 类,Builder 类, Query 下的 Builder 类这三个类有各种连贯操作的姿势,但是最终也是交给 DBManager(也更复杂一点).
    lml12377
        3
    lml12377  
    OP
       2016-07-04 09:28:14 +08:00
    @kaner 嗯,看到了,对 orm 优缺点大概有了了解
    lml12377
        4
    lml12377  
    OP
       2016-07-04 09:30:05 +08:00
    @mitoop 那是不是可以这样理解:不使用 AR/ORM 的情况下,连贯操作的功能仅仅是 queryBuilder ?好处是 sql 写出来整洁、跨驱动并且可以实现安全过滤?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3137 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 13:53 · PVG 21:53 · LAX 05:53 · JFK 08:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.