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 更别提了。。。这东西究竟有何意义?
1
kaner 2016-07-03 22:29:38 +08:00 1
http://www.v2ex.com/t/288772
优缺点都有,看你取舍。 |
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(也更复杂一点).
|