ThinkPHP教程_PHP框架之ThinkPHP(八)【CRUD与连贯操作】
一、CRUD
ThinkPHP提供了灵活和方便的数据库操作方法,其中最基本的就是CRUD四个操作,只有掌握了最基本的CRUD操作,才能更好的运用更多实用的数据库操作方法
CRUD操作通常与连贯操作配合
1、创建操作
使用add()方法或addAll()方法
·add()方法
可以直接传入要插入的数据,而且会在插入之前会过滤掉数据表中不存在的字段以及非法的数据类型(例如对象、数组等非标量数据)。若当前表有主键自动增长并且插入记录成功的话,则返回所插入记录主键值
如果在执行add()操作之前已经创建了数据对象(通过create()方法或data()方法),则add()中可以不传值
·addAll()方法
addAll()方法可以实现批量插入数据
2、读取操作
在ThinkPHP中通常分为读取字段(值,单一值)、读取记录(一维数组,单条记录)和读取记录集(二维数组,多条记录)
·读取字段(值,单一值)
getField()方法
读取某一条记录的某一个字段返回的才是单一值
读取某一条记录的多个字段返回的是一个一维关联数组(键为第一个字段值,值为其余字段值)(之所以说其余,是因为其余字段并非只有一个,若其余字段不止一个,则值用一个空格隔开)。ps,如果第一个字段值为数字样式(不管是int,还是char),形成的是索引数组(虽然在PHP中,索引数组与关联数组并没有本质上区别)!
·读取记录(一维数组,单条记录)
find()方法,最多返回一条记录,即使符合条件的记录有多条,也仅仅返回一条,所以limit()方法对于find()查询是无效的
·读取记录集(二维数组、多条记录)
select()方法或findAll()方法
3、更新操作
ThinkPHP主要使用save()方法完成更新操作,还有setField()、setInc()、setDec()方法
·save()方法
对于save()方法,如果没有where方法()指定更新条件或者数据对象(或者是直接传入的数组)不包含主键字段,则save()方法是不会执行更新操作的。目的是为了保证数据库的安装,避免错误更新表中的所有记录!类似于add()方法,如果在调用该方法之前已经创建了数据对象(通过create()或data()方法),则可以不传值
返回值为受影响的行数,是int类型
·setField()方法
如果只更新某个字段,则也(为什么说也,是因为save()方法也可以更新某一个字段)可以使用setField()方法。当然setField()方法也是可以更新多个字段的,此时传递数组参数即可
setField(参数1,参数2); 参数1表示字段名称,参数2表示将要更新成的值。如果参数1是元素值为各个字段的数组,则参数2也必须是元素值为各个字段相对应值的数组,而且参数1有几个元素,参数2就必须相应的有几个元素,这里必须严格对应,否则会出现很多意想不到的情况
·setInc()方法
只用于数字类型的字段,setInc(参数1,参数2,参数3); 参数1表示要更新的字段,参数2表示where条件,参数3表示增加的数值(参数3省略则表示增加1)
·setDec()方法
只用于数字类型的字段,setDec(参数1,参数2,参数3); 参数1表示要更新的字段,参数2表示where条件,参数3表示减少的数值(参数3省略则表示减少1)
4、删除操作
delete()方法,用于删除记录,取决于where()方法中定义的条件,同时也可以用order()方法和limit()方法来限制删除的记录数
二、连贯操作
ThinkPHP2.0全面启用连贯操作方法,可以有效提高数据存取的代码清晰度和开发效率。连贯操作适用于CRUD操作,并不是只使用与R操作
所有的连贯操作都只有一个参数,而且连贯操作的参数只在当前操作中有效,操作完成后自动清空连贯操作的所有传值。简而言之,连贯操作的结果不会带入以后的查询
举个例子,查看User表中满足密码为123456的前3条记录,并且按照id进行排序
在连贯操作中,除了select()方法必须放在最后之外,其余方法的顺序可随意。注意,这点与MySQL原生的sql语句要区别开,MySQL原生的sql语句的各子语句是有严格的先后顺序关系的,所以一下写法与上面写法等效!
补充,ThinkPHP不仅仅支持连贯操作,还支持直接使用参数进行查询,比如说将上述连贯操作的代码改成如下形式。使用数组参数的方式的话,数组的键是连贯操作的方法名,值是连贯操作的参数
1、where()方法
用于查询、更新、删除操作中条件的定义,相当于原生sql语句中的where子句
参数支持String、Aarry和Object类型
2、table()方法
用于定义要操作数据表的名称。也就是说,如果想通过某模型对象操作非该模型对象对应的表或者说操作多张表,则可使用该方法定义想要操作的数据表
注意,表名必须是带前缀的完整表名,可以使用别名
参数支持String和Array类型(Array类型用于给表起别名,键是原名,值是别名。若不指定值,则不起别名) 强调一下,String类型也可以给表起别名的
3、data()方法
用于向模型对象中传递数据,然后再进行创建、更新和删除操作
注意与create()方法区别开,之前探讨过两者之间的区别
4、field()方法
用于查询操作中所查询字段的定义
参数支持String和Aarry类型(Array类型用于给字段起别名,键是原名,值是别名。若不指定值,则不起别名) 强调一下,String类型也是可以给字段起别名的
5、order()方法
用于结果排序
支持多个字段排序
参数支持String和Array类型(Array类型,键是字段名,值是排序规则。若不指定值,则默认是升序)
6、limit()方法
用于结果限制
实际上,对于不同的数据库,limit子句的语法是不尽相同的,但是ThinkPHP在底层已经为我们屏蔽了这个差异,所以不管是什么类型的数据库 ,都是使用统一的limit()方法
参数支持String
7、page()方法
用于查询分页
page('page,[listRows]'); String类型的参数中,page表示当前为第page页,listRows表示每页多少条记录,如果listRows省略的话,则listRows取limit方法中所限制的记录条数
注意,一般很少使用该方法,而是使用分页类
8、group()方法
用于分组
参数只支持String类型
9、having()方法
用于分组后过滤
参数只支持String类型
10、join()方法
用于连接查询
注意,join()方法是连贯操作中唯一可以多次调用的方法
参数支持String和Array类型
而且在内部已经实现了重复字段的消除处理了的
11、distinct()方法
用于消除重复记录,即进行唯一性过滤
参数支持Bool类型
12、relation()方法
用于关联操作
13、lock()方法
用于数据库中的锁机制
lock(true)就会自动在生成的sql语句后面加上FOR UPDATE
ps,不难看出,以上这些方法,如果参数是String类型,则该参数就可以按照原生sql相对应的子句语法格式进行书写!如果参数是Array类型的,则要注意不同方法中,键与值的含义
posted on 2016-08-30 09:11 Yang24556 阅读(2272) 评论(0) 编辑 收藏 举报