ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 连贯操作 [上一页](# "上一页")[下一页](# "下一页") ThinkPHP模型基础类提供的连贯操作方法,可以有效的提高数据存取的代码清晰度和开发效率,并且支持所有的CURD操作。使用也比较简单, 假如我们现在要查询一个User表的满足状态为1的前10条记录,并希望按照用户的创建时间排序 ,代码如下: `$User->where('status=1')->order('create_time')->limit(10)->select();`这里的where、order和limit方法就被称之为连贯操作方法,T除了select方法必须放到最后一个外(因为select方法并不是连贯操作方法),连贯操作T的方法调用顺序没有先后,例如,下面的代码和上面的等效: `$User->order('create_time')->limit(10)->where('status=1')->select();`如果不习惯使用连贯操作的话,还支持直接使用参数进行查询的方式。例如上面的代码可以改写为:`$User->select(array('order'=>'create_time','where'=>'status=1','limit'=>'10'));`使用数组参数方式的话,索引的名称就是连贯操作的方法名称。其实T不仅仅是查询方法可以使用连贯操作,包括所有的CURD方法都可以使用,例如: `$User->where('id=1')->field('id,name,email')->find();  $User->where('status=1 and id=1')->delete();`连贯操作通常只有一个参数,并且仅在当此查询或者操作有效,完成后会自动清空连贯操作的所有传值(有个别特殊的连贯操作有多个参数,并且会记录当前的传值)。简而言之,连贯操作的结果不会带入以后的查询。 系统支持的连贯操作方法有: | 连贯操作 | 作用 | 支持的参数类型 | |-----|-----|-----| | where | 用于查询或者更新条件的定义 | 字符串、数组和对象 | | table | 用于定义要操作的数据表名称 | 字符串和数组 | | alias | 用于给当前数据表定义别名 | 字符串 | | data | 用于新增或者更新数据之前的数据对象赋值 | 数组和对象 | | field | 用于定义要查询的字段(支持字段排除) | 字符串和数组 | | order | 用于对结果排序 | 字符串和数组 | | limit | 用于限制查询结果数量 | 字符串和数字 | | page | 用于查询分页(内部会转换成limit) | 字符串和数字 | | group | 用于对查询的group支持 | 字符串 | | having | 用于对查询的having支持 | 字符串 | | join* | 用于对查询的join支持 | 字符串和数组 | | union* | 用于对查询的union支持 | 字符串、数组和对象 | | distinct | 用于查询的distinct支持 | 布尔值 | | lock | 用于数据库的锁机制 | 布尔值 | | cache | 用于查询缓存 | 支持多个参数 | | relation | 用于关联查询(需要关联模型支持) | 字符串 | 所有的连贯操作都返回当前的模型实例对象(this),其中带*标识的表示支持多次调用。 ### WHERE <table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">where 用于查询或者更新条件的定义</th></tr><tr><td>用法</td> <td>where($where)</td> </tr><tr><td>参数</td> <td>where(必须):查询或者操作条件,支持字符串、数组和对象</td> </tr><tr><td>返回值</td> <td>当前模型实例</td> </tr><tr><td>备注</td> <td>如果不调用where方法,默认不会执行更新和删除操作</td> </tr></table> Where方法是使用最多的连贯操作方法,更详细的用法请参考后面的6.13 CURD操作和6.18查询语言部分。 ### TABLE <table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">table  定义要操作的数据表名称,动态改变当前操作的数据表名称,需要写数据表的全名,包含前缀,可以使用别名和跨库操作</th> </tr><tr><td>用法</td> <td>table($table,$parse=null)</td> </tr><tr><td>参数</td> <td><p>table(必须):数据表名称,支持操作多个表,支持字符串、数组和对象</p><p>parse(可选)预处理参数,详见14.3防止SQL注入 查询条件预处理</p></td> </tr><tr><td>返回值</td> <td>当前模型实例</td> </tr><tr><td>备注</td> <td>如果不调用table方法,会自动获取模型对应或者定义的数据表</td> </tr></table> 用法示例:`$Model->Table('think_user user')->where('status>1')->select();`也可以在table方法中跨库操作,例如:`$Model->Table('db_name.think_user user')->where('status>1')->select();`Table方法的参数支持字符串和数组,数组方式的用法:`$Model->Table(array('think_user'=>'user','think_group'=>'group'))->where('status>1')->select();`使用数组方式定义的优势是可以避免因为表名和关键字冲突而出错的情况。 一般情况下,无需调用table方法,默认会自动获取当前模型对应或者定义的数据表。 ### DATA <table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">data  可以用于新增或者保存数据之前的数据对象赋值</th> </tr><tr><td>用法</td> <td>data($data)</td> </tr><tr><td>参数</td> <td>data(必须):数据,支持数组和对象</td> </tr><tr><td>返回值</td> <td>当前模型实例</td> </tr><tr><td>备注</td> <td>如果不调用data方法,则会取当前的数据对象或者传入add和save的数据</td> </tr></table> 使用示例:`$Model->data($data)->add(); $Model->data($data)->where('id=3')->save();`Data方法的参数支持对象和数组,如果是对象会自动转换成数组。如果不定义data方法赋值,也可以使用create方法或者手动给数据对象赋值的方式。 模型的data方法除了创建数据对象之外,还可以读取当前的数据对象, 例如:`$this->find(3); $data = $this->data();` ### FIELD <table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">field  用于定义要查询的字段</th> </tr><tr><td>用法</td> <td>field($field,$except=false)</td> </tr><tr><td>参数</td> <td><p>field(必须):字段名,支持字符串和数组,支持指定字段别名;如果为true则表示显式或者数据表的所有字段。</p><br/><p>except(可选):是否排除,默认为false,如果为true表示定义的字段为数据表中排除field参数定义之外的所有字段。</p></td> </tr><tr><td>返回值</td> <td>当前模型实例</td> </tr><tr><td>备注</td> <td>如果不调用field方法,则默认返回所有字段,和field('*')等效</td> </tr></table> 使用示例:`$Model->field('id,nickname as name')->select(); $Model->field(array('id','nickname'=>'name'))->select();`如果不调用field方法或者field方法传入参数为空的话,和使用field('*')是等效的。 如果需要显式的传入所有的字段,可以使用下面的方法:`$Model->field(true)->select();`但是我们更建议只获取需要显式的字段名,或者采用字段排除方式来定义,例如:`$Model->field('status',true)->select();`表示获取除了status之外的所有字段。 ### ORDER <table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">order  用于对操作结果排序</th> </tr><tr><td>用法</td> <td>order($order)</td> </tr><tr><td>参数</td> <td>order(必须):排序的字段名,支持字符串和数组,支持多个字段排序</td> </tr><tr><td>返回值</td> <td>当前模型实例</td> </tr><tr><td>备注</td> <td>如果不调用order方法,按照数据库的默认规则</td> </tr></table> 使用示例:`order('id desc') `排序方法支持对多个字段的排序`order('status desc,id asc')`order方法的参数支持字符串和数组,数组的用法如下:`order(array('status'=>'desc','id'))` ### LIMIT <table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">limit  用于定义要查询的结果限制(支持所有的数据库类型)</th> </tr><tr><td>用法</td> <td>limit($limit)</td> </tr><tr><td>参数</td> <td>limit(必须):限制数量,支持字符串</td> </tr><tr><td>返回值</td> <td>当前模型实例</td> </tr><tr><td>备注</td> <td>如果不调用limit方法,则表示没有限制</td> </tr></table> 备注 如果不调用limit方法,则表示没有限制 我们知道不同的数据库类型的limit用法是不尽相同的,但是在ThinkPHP的用法里面始终是统一的方法,也就是limit('offset,length') ,无论是Mysql、SqlServer还是Oracle数据库,都是这样使用,系统的数据库驱动类会负责解决这个差异化。 使用示例:`limit('1,10')`如果使用limit('10') 等效于 limit('0,10') 3.1版本以后,limit方法增加第二个参数支持,例如:`$this->limit(10,100)->select();`和之前的用法`$this->limit('10,100')->select();`等效。 ### PAGE <table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">page  用于定义要查询的数据分页</th> </tr><tr><td>用法</td> <td>page($page)</td> </tr><tr><td>参数</td> <td>page(必须):分页,支持字符串</td> </tr><tr><td>返回值</td> <td>当前模型实例</td> </tr><tr><td>备注</td> <td>无</td> </tr></table> Page操作方法是新增的特性,可以更加快速的进行分页查询。 Page方法的用法和limit方法类似,格式为:`Page('page[,listRows]')`Page表示当前的页数,listRows表示每页显示的记录数。例如:`Page('2,10')`表示每页显示10条记录的情况下面,获取第2页的数据。 listRow如果不写的话,会读取limit('length') 的值,例如:`limit(25)->page(3);`表示每页显示25条记录的情况下面,获取第3页的数据。 如果limit也没有设置的话,则默认为每页显示20条记录。 3.1版本以后,page方法增加第二个参数支持,例如:`$this->page(5,25)->select();`和之前的用法`$this->page('5,25')->select();`等效。 ### GROUP <table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">group  用于数据库的group查询支持</th> </tr><tr><td>用法</td> <td>group($group)</td> </tr><tr><td>参数</td> <td>group(必须):group的字段名,支持字符串</td> </tr><tr><td>返回值</td> <td>当前模型实例</td> </tr><tr><td>备注</td> <td>无</td> </tr></table> 使用示例:`group('user_id')`Group方法的参数只支持字符串 ### HAVING <table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">having  用于数据库的having查询支持</th> </tr><tr><td>用法</td> <td>having($having)</td> </tr><tr><td>参数</td> <td>having(必须):having,支持字符串</td> </tr><tr><td>返回值</td> <td>当前模型实例</td> </tr><tr><td>备注</td> <td>无</td> </tr></table> 使用示例:`having('user_id>0')`having方法的参数只支持字符串 ### JOIN <table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">join  用于数据库的join查询支持</th> </tr><tr><td>用法</td> <td>join($join)</td> </tr><tr><td>参数</td> <td>join(必须):join操作,支持字符串和数组</td> </tr><tr><td>返回值</td> <td>当前模型实例</td> </tr><tr><td>备注</td> <td>join方法支持多次调用</td> </tr></table> 使用示例:`$Model->join(' work ON artist.id = work.artist_id')->join('card ON artist.card_id = card.id')->select();`默认采用LEFT JOIN 方式,如果需要用其他的JOIN方式,可以改成`$Model->join('RIGHT JOIN work ON artist.id = work.artist_id')->select();`如果join方法的参数用数组的话,只能使用一次join方法,并且不能和字符串方式混合使用。 例如:`join(array(' work ON artist.id = work.artist_id','card ON artist.card_id = card.id'))` ### UNION <table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">union  用于数据库的union查询支持</th> </tr><tr><td>用法</td> <td>union($union,$all=false)</td> </tr><tr><td>参数</td> <td>union(必须):union操作,支持字符串、数组和对象<br/> all(可选):是否采用UNION ALL 操作,默认为false</td> </tr><tr><td>返回值</td> <td>当前模型实例</td> </tr><tr><td>备注</td> <td>Union方法支持多次调用</td> </tr></table> 使用示例:`$Model->field('name')       ->table('think_user_0')       ->union('SELECT name FROM think_user_1')       ->union('SELECT name FROM think_user_2')       ->select();`数组用法:`$Model->field('name')       ->table('think_user_0')       ->union(array('field'=>'name','table'=>'think_user_1'))       ->union(array('field'=>'name','table'=>'think_user_2'))       ->select();`或者`$Model->field('name')       ->table('think_user_0')       ->union(array('SELECT name FROM think_user_1','SELECT name FROM think_user_2'))       ->select();`支持UNION ALL 操作,例如:`$Model->field('name')       ->table('think_user_0')       ->union('SELECT name FROM think_user_1',true)       ->union('SELECT name FROM think_user_2',true)       ->select();`或者`$Model->field('name')       ->table('think_user_0')       ->union(array('SELECT name FROM think_user_1','SELECT name FROM think_user_2'),true)       ->select();`每个union方法相当于一个独立的SELECT语句。 注意:UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。 ### DISTINCT <table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">distinct  查询数据的时候进行唯一过滤</th> </tr><tr><td>用法</td> <td>distinct($distinct)</td> </tr><tr><td>参数</td> <td>distinct(必须):是否采用distinct,支持布尔值</td> </tr><tr><td>返回值</td> <td>当前模型实例</td> </tr><tr><td>备注</td> <td>无</td> </tr></table> 使用示例:`$Model->Distinct(true)->field('name')->select();` ### RELATION <table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">relation  用于关联查询支持</th> </tr><tr><td>用法</td> <td>relation($relation)</td> </tr><tr><td>参数</td> <td>relation(必须):关联操作</td> </tr><tr><td>返回值</td> <td>当前模型实例</td> </tr><tr><td>备注</td> <td>使用关联模型才支持</td> </tr></table> 关联查询方法的详细用法请参考后面的6.23关联模型部分。 ### LOCK <table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">lock  用于查询或者写入锁定</th> </tr><tr><td>用法</td> <td>lock($lock)</td> </tr><tr><td>参数</td> <td>lock(必须):是否需要锁定,支持布尔值</td> </tr><tr><td>返回值</td> <td>当前模型实例</td> </tr><tr><td>备注</td> <td>join方法支持多次调用</td> </tr></table> Lock方法是用于数据库的锁机制,如果在查询或者执行操作的时候使用:`lock(true)`就会自动在生成的SQL语句最后加上 FOR UPDATE或者FOR UPDATE NOWAIT(Oracle数据库)。 ### CACHE <table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">cache 用于查询缓存操作</th> </tr><tr><td>用法</td> <td>cache($key=true,$expire='',$type='')</td> </tr><tr><td>参数</td> <td><p>key(可选):是否启用查询缓存,支持布尔值和字符串,如果是字符串表示查询缓存的缓存名</p><br/><p>expire(可选):查询缓存的有效期,如果留空取系统默认的缓存有效期</p><br/><p>type(可选):查询缓存的缓存类型,如果留空取系统默认的缓存类型</p></td> </tr><tr><td>返回值</td> <td>当前模型实例</td> </tr><tr><td>备注</td> <td>如果不调用field方法,则默认返回所有字段,和field('*')等效</td> </tr></table> 查询缓存的详细用法会在后面的12.6查询缓存部分详细描述。 [上一页](# "上一页")[下一页](# "下一页")