ThinkPHP CURD操作

ThinkPHP提供了灵活和方便的数据操作方法,对数据库操作的四个基本操作(CURD):创建、更新、读取和删除的实现是最基本的,也是必须掌握的,在这基础之上才能熟悉更多实用的数据操作方法。CURD操作通常是可以和连贯操作配合完成的。下面来分析下各自的用法:
(下面的CURD操作我们均以M方法创建模型实例来说明,因为不涉及到具体的业务逻辑)
http://doc.thinkphp.cn/manual/curd.html

创建(Create)
在ThinkPHP中使用add方法新增数据到数据库(而并不是create方法)。
add 写入(新增)数据到数据库
用法 add($data='',$options=array(),$replace=false)
参数

data(可选):要新增的数据,支持数组和对象,如果留空取当前数据对象

options(可选):操作表达式,通常由连贯操作完成,默认为空数组

replace(可选):是否允许写入时更新,默认为false(个别数据库支持)
回调接口

写入前 _before_insert(&$data,$options)

写入成功 _after_insert($data,$options)
返回值

如果数据非法或者查询错误则返回false

如果是自增主键 则返回主键值,否则返回1
相关方法 通常和data、create方法配合使用
使用示例如下:

$User = M("User"); // 实例化User对象
$data['name'] = 'ThinkPHP';
$data['email'] = 'ThinkPHP@gmail.com';
$User->add($data);

或者使用data方法连贯操作

$User->data($data)->add();

如果在add之前已经创建数据对象的话(例如使用了create或者data方法),add方法就不需要再传入数据了。
使用create方法的例子:

$User = M("User"); // 实例化User对象
// 根据表单提交的POST数据创建数据对象
$User->create();
$User->add(); // 根据条件保存修改的数据

如果你的主键是自动增长类型,并且如果插入数据成功的话,Add方法的返回值就是最新插入的主键值,可以直接获取。
从2.1版开始恢复了批量插入数据的addAll方法(仅针对Mysql数据库),如:

$User->addAll($data)

同时在数据插入时允许更新操作:

add($data='',$options=array(),$replace=false)

其中add方法增加$replace参数(是否添加数据时允许覆盖),true表示覆盖,默认为false
8
读取(Read)
在ThinkPHP中读取数据的方式很多,通常分为读取数据和读取数据集。
读取数据集使用select方法(新版已经废除原来的findall方法):
select 查询数据集
用法 select($options=array())
参数 options(可选):为数组的时候表示操作表达式,通常由连贯操作完成;如果是数字或者字符串,表示主键值。默认为空数组。
回调接口 查询成功 _after_select(&$resultSet,$options)
返回值

查询错误返回false

查询结果为空返回null

查询成功返回查询的结果集(二维索引数组)
相关方法 通常配合连贯操作where、field、order、limit、join等一起使用
使用示例:

$User = M("User"); // 实例化User对象
// 查找status值为1的用户数据 以创建时间排序 返回10条数据
$list = $User->where('status=1')->order('create_time')->limit(10)->select();

Select方法配合连贯操作方法可以完成复杂的数据查询。而最复杂的连贯方法应该是where方法的使用,因为这部分涉及的内容较多,我们会在查询语言部分就如何进行组装查询条件进行详细的使用说明。基本的查询暂时不涉及关联查询部分,而是统一采用关联模型来进行数据操作,这一部分请参考关联模型部分。
2
读取数据使用find方法:
find 查询数据
用法 find($options=array())
参数 options(可选):为数组的时候表示操作表达式,通常由连贯操作完成;为数字或者字符串的时候表示主键值。默认为空数组。
回调接口 查询后 _after_find(&$result,$options)
返回值

如果查询错误返回false

如果查询结果为空返回null

如果查询成功返回查询的结果(索引数组)
相关方法 通常配合连贯操作where、field、order、join等一起使用
读取数据的操作其实和数据集的类似,select可用的所有连贯操作方法也都可以用于find方法,区别在于find方法最多只会返回一条记录,因此limit方法对于find查询操作是无效的。
下面是一些查询的例子:

$User = M("User"); // 实例化User对象
// 查找status值为1name值为think的用户数据
$User->where('status=1 AND name="think"')->find();

即使满足条件的数据不止一条,find方法也只会返回第一条记录。
1
如果要读取某个字段的值,可以使用getField方法
getField 查询某个字段的值
用法 getField($field,$sepa=null)
参数

field(必须):要获取的字段字符串(多个用逗号分隔)

sepa(可选):字段数据间隔符号,如果是 NULL返回数组为数组。默认为null。
回调接口 查询后 _after_find(&$result,$options)
返回值

如果查询结果为空返回null

如果field是一个字段则返回该字段的值

如果field是多个字段,返回数组。数组的索引是第一个字段的值,sepa为null则返回二维数组。
相关方法 通常配合连贯操作where、limit、order等一起使用
示例如下:

$User = M("User"); // 实例化User对象
// 获取ID为3的用户的昵称
$nickname = $User->where('id=3')->getField('nickname');

当只有一个字段的时候,默认返回一个值。
如果需要返回数组,可以用:

$this->getField('id',true); // 获取id数组

如果传入多个字段的话,默认返回一个关联数组:

$User = M("User"); // 实例化User对象
// 获取所有用户的ID和昵称列表
$list = $User->getField('id,nickname');

返回的list是一个数组,键名是用户的id, 键值是用户的昵称nickname。
如果传入多个字段的名称,例如:

$list = $User->getField('id,nickname,email');

返回的是一个二维数组,类似select方法的返回结果,区别的是这个二维数组的键名是用户的id(准确的说是getField方法的第一个字段名)。
如果我们传入一个字符串分隔符:

$list = $User->getField('id,nickname,email',':');

那么返回的结果就是一个数组,键名是用户id,键值是 nickname:email的输出字符串。

getField方法的sepa参数还可以支持限制数量,例如:

$this->getField('id,name',5); // 限制返回5条记录
$this->getField('id',3); // 获取id数组 限制3条记录

可以配合使用order方法使用。
6
更新(Update)
在ThinkPHP中使用save方法更新数据库,并且也支持连贯操作的使用。
save 更新数据到数据库
用法 save($data='',$options=array())
参数

data:要保存的数据,如果为空,则取当前的数据对象。

options:为数组的时候表示操作表达式,通常由连贯操作完成;为数字或者字符串的时候表示主键值。默认为空数组。
回调接口

更新前_before_update(&$data,$options)

更新成功后 _after_update($data,$options)
返回值

如果查询错误或者数据非法返回false

如果更新成功返回影响的记录数
相关方法 通常配合连贯操作where、field、order等一起使用

$User = M("User"); // 实例化User对象
// 要修改的数据对象属性赋值
$data['name'] = 'ThinkPHP';
$data['email'] = 'ThinkPHP@gmail.com';
$User->where('id=5')->save($data); // 根据条件保存修改的数据

为了保证数据库的安全,避免出错更新整个数据表,如果没有任何更新条件,数据对象本身也不包含主键字段的话,save方法不会更新任何数据库的记录。
因此下面的代码不会更改数据库的任何记录

$User->save($data);

除非使用下面的方式:

$User = M("User"); // 实例化User对象
// 要修改的数据对象属性赋值
$data['id'] = 5;
$data['name'] = 'ThinkPHP';
$data['email'] = 'ThinkPHP@gmail.com';
$User->save($data); // 根据条件保存修改的数据

如果id是数据表的主键的话,系统自动会把主键的值作为更新条件来更新其他字段的值。
还有一种方法是通过create或者data方法创建要更新的数据对象,然后进行保存操作,这样save方法的参数可以不需要传入。

$User = M("User"); // 实例化User对象
// 要修改的数据对象属性赋值
$data['name'] = 'ThinkPHP';
$data['email'] = 'ThinkPHP@gmail.com';
$User->where('id=5')->data($data)->save(); // 根据条件保存修改的数据

使用create方法的例子:

$User = M("User"); // 实例化User对象
// 根据表单提交的POST数据创建数据对象
$User->create();
$User->save(); // 根据条件保存修改的数据

上面的情况,表单中必须包含一个以主键为名称的隐藏域,才能完成保存操作。
如果只是更新个别字段的值,可以使用setField方法。
setField 更新某个字段的值
用法 setField($field,$value='')
参数 options(可选):为数组的时候表示操作表达式,通常由连贯操作完成;为数字或者字符串的时候表示主键值。默认为空数组。
返回值

如果查询错误返回false

如果更新成功返回影响的记录数
相关方法 必须配合连贯操作where一起使用
使用示例:

$User = M("User"); // 实例化User对象
// 更改用户的name值
$User-> where('id=5')->setField('name','ThinkPHP');

setField方法支持同时更新多个字段,只需要传入数组即可,例如:

$User = M("User"); // 实例化User对象
// 更改用户的name和email的值
$data = array('name'=>'ThinkPHP','email'=>'ThinkPHP@gmail.com');
$User-> where('id=5')->setField($data);

2
而对于统计字段(通常指的是数字类型)的更新,系统还提供了setInc和setDec方法。
setInc /setDec 字段增长/字段减少
用法

setInc($field,$step=1)字段值增长

setDec($field,$step=1)字段值减少
参数

field:要更新的字段名。

step:增长或者减少的数值,默认为1。
回调接口

如果查询错误返回false

如果更新成功返回影响的记录数
返回值

如果查询错误返回false

如果更新成功返回影响的记录数
相关方法 必须配合连贯操作where一起使用

$User = M("User"); // 实例化User对象
$User->where('id=5')->setInc('score',3); // 用户的积分加3
$User->where('id=5')->setInc('score'); // 用户的积分加1
$User->where('id=5')->setDec('score',5); // 用户的积分减5
$User->where('id=5')->setDec('score'); // 用户的积分减1

2
删除(Delete)
在ThinkPHP中使用delete方法删除数据库中的记录。
用法 delete($options=array())
参数 options:为数组的时候表示操作表达式,通常由连贯操作完成,如果没有传入任何删除条件,则取当前数据对象的主键作为条件;为数字或者字符串的时候表示主键值。默认为空数组。
回调接口 删除成功后 _after_delete($data,$options)
返回值

如果查询错误返回false

如果删除成功返回影响的记录数
相关方法 通常配合连贯操作where、field、order等一起使用
示例如下:

$User = M("User"); // 实例化User对象
$User->where('id=5')->delete(); // 删除id为5的用户数据
$User->where('status=0')->delete(); // 删除所有状态为0的用户数据

delete方法可以用于删除单个或者多个数据,主要取决于删除条件,也就是where方法的参数,也可以用order和limit方法来限制要删除的个数,例如:

// 删除所有状态为0的5 个用户数据 按照创建时间排序
$User->where('status=0')->order('create_time')->limit('5')->delete();

ThinkPHP CURD mysql操作的更多相关文章

  1. ThinkPHP CURD 操作

    Thinkphp CURD操作php中实例还对象即可操作 (目录) 1.Add 1 调式程序 3 调出显示页面Trace信息 3 Dump 的含义 4 2.数据库查询 4 1.直接使用字符串进行查找 ...

  2. ThinkPHP CURD返回结果参考

    ThinkPHP CURD返回结果参考: 1)查询$table->find() ##返回一条记录,是一个关联数组,是一维数组.$table->select() ##返回第一维是索引数组,第 ...

  3. ThinkPHP CURD方法中field方法详解

    导读:ThinkPHP CURD方法的field方法属于模型的连贯操作方法之一,主要目的是标识要返回或者操作的字段,可以用于查询和写入操作. 1.用于查询在查询操作中field方法是使用最频繁的.$M ...

  4. Mysql操作初级

    Mysql操作初级 本节内容 数据库概述 数据库安装 数据库操作 数据表操作 表内容操作 1.数据库概述 数据库管理系统叫做DBMS 1.什么是数据库 ? 答:数据的仓库,如:在ATM的示例中我们创建 ...

  5. python学习道路(day12note)(mysql操作,python链接mysql,redis)

    1,针对mysql操作 SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass'); 设置密码 update user set password ...

  6. 学习笔记:MySQL操作初步

    对数据库的操作:SQL语言 一:SQL:Structured Query Language,结构化查询语言! 二:DDL:Data Definition Language,数据定义语言 三:DML:D ...

  7. ecshop的Mysql操作类

    摘要,这是直接摘抄的ecshop的mysql操作类:不过他这里的缓存是用的文件缓存,我们如果想直接使用,可以替换成memcache的或者redis的! <?php /** * ECSHOP MY ...

  8. shell执行mysql操作

    http://ully.iteye.com/blog/1226494 http://www.jb51.net/article/55207.htm shell执行mysql操作 mysql  -hhos ...

  9. mysql操作类库--摘抄

    <!--?php /** +---------------------------------- * MySQL操作类库 +---------------------------------- ...

随机推荐

  1. Django---简单from表单提交

    表单提交可能会报错,注意一行代码就可以解决: 简单配置路由: 简单表单提交: <form action="/index/" method="post"&g ...

  2. 8.20 前端 js

    2018-8-20 17:40:12 js参考: https://www.cnblogs.com/liwenzhou/p/8004649.html 2018-8-20 20:33:31 css学完了 ...

  3. kernel中文件的读写操作可以使用vfs_read()和vfs_write

    需要在Linux kernel--大多是在需要调试的驱动程序--中读写文件数据.在kernel中操作文件没有标准库可用,需要利用kernel的一些函数,这些函数主要有: filp_open() fil ...

  4. HDU 1565 - 方格取数(1) - [状压DP][网络流 - 最大点权独立集和最小点权覆盖集]

    题目链接:https://cn.vjudge.net/problem/HDU-1565 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32 ...

  5. Spyer中添加一些常用包的方法

    我用的是Anaconda中的Spyer编译,在导入包pyaudio时,发现找不到,需要手工导入.可以打开Anacoda promt,查看已经安装的包名用:pip list Spyer中的所有包在这里安 ...

  6. The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path:

    运行环境: Intellij idea 14 在改了项目名称. 运行时候出现了 The APR based Apache Tomcat Native library which allows opti ...

  7. windows7系统下让所有文件夹都使用同一种视图的方法

    Windows7系统可以对每个文件夹进行个性化视图设置,可以根据自己的个人喜好和实际需要更改文件或文件夹图标的大小,或者让文件或文件夹以列 表.平铺等方式显示.但是,如果你对N个文件夹视图进行了风格各 ...

  8. java实现从服务端下载文件

    这边用一个简单的servlet实现java从服务端下载文件的操作 写一个servlet: <servlet> <servlet-name>DownloadServlet< ...

  9. Balanced Lineup---poj3264线段树基础

    题目链接 求对应区间最大值与最小值的差: #include<stdio.h> #include<string.h> #include<algorithm> #inc ...

  10. Python开发【笔记】:获取mp3文件获取信息

    import eyed3 def main(): mp3 = '8200031001_13429822982_1_00163e086216990b11e82403f00d3d9a.mp3' xx = ...