ThinkPHP3.0完全开发手册
ThinkPHP内置的ORM和ActiveRecord模式实现了方便的数据存取操作,而且新版增加的连贯操作功能更是让这个数据操作更加清晰,但是ThinkPHP仍然保留了原生的SQL查询和执行操作支持,为了满足复杂查询的需要和一些特殊的数据操作,SQL查询的返回值因为是直接返回的Db类的查询结果,没有做任何的处理。主要包括下面两个方法:
1、query方法
query 执行SQL查询操作 |
|
用法 |
query($sql,$parse=false) |
参数 |
query(必须):要查询的SQL语句 parse(可选):是否需要解析SQL |
返回值 |
如果数据非法或者查询错误则返回false 否则返回查询结果数据集(同select方法) |
使用示例:
$Model = new Model() // 实例化一个model对象 没有对应任何数据表
$Model->query("select * from think_user where status=1");
如果你当前采用了分布式数据库,并且设置了读写分离的话,query方法始终是在读服务器执行,因此query方法对应的都是读操作,而不管你的SQL语句是什么。
2、execute方法
execute用于更新和写入数据的sql操作 |
|
用法 |
execute($sql,$parse=false) |
参数 |
query(必须):要执行的SQL语句 parse(可选):是否需要解析SQL |
返回值 |
如果数据非法或者查询错误则返回false 否则返回影响的记录数 |
使用示例:
$Model = new Model() // 实例化一个model对象 没有对应任何数据表
$Model->execute("update think_user set name='thinkPHP' where status=1");
如果你当前采用了分布式数据库,并且设置了读写分离的话,execute方法始终是在写服务器执行,因此execute方法对应的都是写操作,而不管你的SQL语句是什么。
3、其他技巧
自动获取当前表名
通常使用原生SQL需要手动加上当前要查询的表名,如果你的表名以后会变化的话,那么就需要修改每个原生SQL查询的sql语句了,针对这个情况,系统还提供了一个小的技巧来帮助解决这个问题。
例如:
$model = M("User");
$model->query('select * from __TABLE__ where status>1');
我们这里使用了__TABLE__ 这样一个字符串,系统在解析的时候会自动替换成当前模型对应的表名,这样就可以做到即使模型对应的表名有所变化,仍然不用修改原生的sql语句。
支持连贯操作和SQL解析
新版对query和execute两个原生SQL操作方法增加第二个参数支持, 表示是否需要解析SQL (默认为false 表示直接执行sql ),如果设为true 则会解析SQL中的特殊字符串 (需要配合连贯操作)。
例如,支持 如下写法:
$model->table("think_user")
->where(array("name"=>"thinkphp"))
->field("id,name,email")
->query('select %FIELD% from %TABLE% %WHERE%',true);
其中query方法中的%FIELD%、%TABLE%和%WHERE%字符串会自动替换为同名的连贯操作方法的解析结果SQL,支持的替换字符串包括:
替换字符串 |
对应连贯操作方法 |
%FIELD% |
field |
%TABLE% |
table |
%DISTINCT% |
distinct |
%WHERE% |
where |
%JOIN% |
join |
%GROUP% |
group |
%HAVING% |
having |
%ORDER% |
order |
%LIMIT% |
limit |
%UNION% |
union |