thinkphp 对 sql 操作的疑问

2016-07-03 22:05:25 +08:00
 lml12377

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 更别提了。。。这东西究竟有何意义?

1558 次点击
所在节点    问与答
4 条回复
kaner
2016-07-03 22:29:38 +08:00
http://www.v2ex.com/t/288772
优缺点都有,看你取舍。
mitoop
2016-07-04 00:05:51 +08:00
连贯操作只是方便构建查询语句,TP 是,Laravel 也是,构建好的查询语句最终交给 DB 类执行,TP 数据库扩展是在 Driver 层扩展的, DB 下 Driver 基类定义了规则,不同实现在各自不同类中具体实现,见 DB\Driver 下的各种模型类 。 Laravel 构建语句更复杂一点功能也更强 Model 类,Builder 类, Query 下的 Builder 类这三个类有各种连贯操作的姿势,但是最终也是交给 DBManager(也更复杂一点).
lml12377
2016-07-04 09:28:14 +08:00
@kaner 嗯,看到了,对 orm 优缺点大概有了了解
lml12377
2016-07-04 09:30:05 +08:00
@mitoop 那是不是可以这样理解:不使用 AR/ORM 的情况下,连贯操作的功能仅仅是 queryBuilder ?好处是 sql 写出来整洁、跨驱动并且可以实现安全过滤?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/290024

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX