ThinkPHP3.0完全开发手册                                           

 

6.17.8          SQL查询

ThinkPHP内置的ORMActiveRecord模式实现了方便的数据存取操作,而且新版增加的连贯操作功能更是让这个数据操作更加清晰,但是ThinkPHP仍然保留了原生的SQL查询和执行操作支持,为了满足复杂查询的需要和一些特殊的数据操作,SQL查询的返回值因为是直接返回的Db类的查询结果,没有做任何的处理。主要包括下面两个方法:

1query方法

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语句是什么。

 

2execute方法

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解析

新版对queryexecute两个原生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

 


NetPc