ThinkPHP3快速入门教程二:数据CURD
CURD(创建[Create]、更新[Updata]、读取[Read]、删除[Delete]),定义了用于处理数据的基本原子操作。
CURD在具体的应用中并非一定使用create、updata、read、delete字样的方法,但是他们完成的功能是一致的。
例如:
ThinkPHP就是使用add、save、select和delete方法表示模型的CURD操作。
一、创建数据
CURD的Create操作通常会通过表单来提交数据,首先,我们在项目的Tpl/Form目录下面创建一个add.html模板文件,内容为:
<FORM method=”post” action=”_URL_/insert”>
标题:<input type=”text” name=”title”><br/>
内容:<textarea name=”content” rows=”5” cols=”45”></textarea><br/>
<input type=”submit” value=”提交”>
</form>
在项目的Action目录下面创建一个FormAction.class.php文件,暂时只需要定义FormAction类,不需要添加任何操作方法,代码如下:
Class FormAction extends Action {}
接下来,访问:http://localhost/app/index.php/Form/add
注意:
我们并没有在控制器里面定义add操作方法,但是很显然,访问是正常的。
原因:
因为ThinkPHP在没有找到对应操作方法的情况下,会检查是否存在对应的模板文件,由于我们有对应的add模板文件,所以控制器就直接渲染该模板文件输出了。
所以说对于没有任何实际逻辑的操作方法,我们只需要直接定义对应的模板文件就行了。
表单处理:
Class FormAction extends Action {
public function insert(){
$Form = D(‘Form’);
If($Form -> create()){
$result = $form->add();
If($result){
$this -> success(‘操作成功!’);
}else{
$this -> error(‘写入错误!’);
}
}else{
$this -> error($Form -> getError());
}
}
}
如果你的主键是自增类型的话,add方法的返回值就是该主键的值。
不是自增主键的话,返回值表示插入数据的个数。如果返回false则表示写入出错。
二、模型
建think_form表:
CREATE TABLE IF NOT EXISTS ‘think_form’ (
‘id’ smallint(4) unsigned NOT NULL AUTO_INCREMENT,
‘title’ varchar(255) NOT NULL,
‘content’ varchar(255) NOT NULL,
‘create_time’ int(11) unsigned NOT NULL,
PRIMARY KEY (‘id’)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
注意:D函数和M函数不同,需要有对应的模型类。
创建模型类:
模型名的定义规范:模型名+Model.class.php(模型名的定义采用驼峰法并且首字母大写)
我们在项目的Lib/Model目录下面创建FormModel.class.php文件,添加代码如下:
Class FormModel extends Model {
//定义自动验证
Protected $_validate = array(
Array(‘title’,’require’,’标题必须’),
);
//完成自动完成
Protected $_auto = array(
Array(‘create_time’,’time’,1,’function’),
);
}
主要用于表单的自动验证和自动完成。
如果使用D函数实例化模型类,一般需要对应一个数据模型类,而且create方法会自动把表单提交的数据进行自动验证和完成(如果有定义的话)。
如果验证成功,就表示数据对象已经成功创建,但目前只是保存在内存中,直到我们调用add方法写入数据到数据库。这样就完成了一个完整的Create操作,所以可以看到ThinkPHP在创建数据的过程中使用了两步:
第一步,create方法创建数据对象,
第二步,使用add方法把当前的数据对象写入数据库
当然可以完全跨越第一步,直接进行第二步,但是这样的预处理有几个优势:
1、无论表单有多复杂,create方法都可以用一行代码轻松创建数据对象,
2、在写入数据之前,可以对数据进行验证和补充;
目的:确保写入数据库的数据安全和有效。
效果:验证完毕不输入标题就直接提交表单的话,系统会给出标题必须这样的提示信息。
如果你的数据完全是内部操作写入而不是通过表单的话(也就是说可以充分信任数据的安全),那么可以直接使用add方法,如:
$Form = D(‘Form’);
$data[‘title’] = ‘ThinkPHP’;
$data[‘content’] = ‘表单内容’;
$Form->add($data);
也可以支持对象方式操作:
$Form = D(‘Form’);
$Form -> title = “ThinkPHP”;
$Form -> content = “表单内容”;
$Form -> add();
对象方式操作的时候,add方法无需传入数据,会自动识别当前的数据对象赋值。
三、读取数据
我们可以通过find方法获取一个单一数据,定义read操作方法如下:
Public function read($id=0){
$Form = M(‘Form’);
//读取数据
$data = $Form -> find($id);
If($data){
$this->data = $data;//模板变量赋值
}else{
$this->error(‘数据错误’);
}
$this->display();
}
read操作方法有一个参数$id,表示我们可以接受URL里面的id变量(
这里用M方法而没有用D方法,是因为find方法是基础模型类Model中的方法,
所以没有必要浪费开销去实例化FormModel类(即使已经定义了FormModel类)。
我们通常采用find方法读取某个数据,这里使用了AR模式来操作,所以没有传入查询条件,
Find($id)表示读取主键为$id值的数据,find方法的返回值是一个如下格式的数组:
Array(
‘id’ => 5,
‘title’ => ‘测试标题’,
‘content’ => ‘测试内容 ’,
‘status’ => 1,
)
然后我们可以在模板中输出数据,添加一个read模板文件,
<table>
<tr>
<td>id;</td>
<td>{$data.title}</td>
</tr>
<tr>
<td>标题:</td>
<td>{$data.title}</td>
</tr>
<tr>
<td>内容:</td>
<td>{$data.content}</td>
</tr>
</table>
访问路径:http://localhost/app/index.php/Form/read/id/1
查询某个字段可以使用getField方法:
$Form = M(“Form”);
//获取标题
$title = $Form -> where(‘id=3’)->getField(‘title’);
四、更新数据
对数据进行更新,添加一个编辑表单的模板文件edit.html,如下:
<FORM method=”post” action=”_URL_/update”>
标题:<input type=”text” name=”title” value=”{$vo.title}”><br/>
内容:<textarea name=”content” rows=”5” cols=”45”>{$vo,content}}</textarea>
<br/>
<input type=”hidden” name=”id” value=”{$vo.id}”>
<input type=”submit” value=”提交”>
</FORM>
因是更新数据所以只对模板进行变量赋值,所以,我们这次需要在FormAction类添加两个操作方法:
Public function edit($id=0){
$Form = M(‘Form’);
$this -> vo = $Form -> find($id);
$this -> display();
}
Public function update(){
$Form = D(‘Form’);
If($Form->create()){
$result = $Form->save();
If($result){
$this -> success(‘操作成功!’);
}else{
$this -> error(‘写入错误!’);
}
}else{
$this->error($Form->getError());
}
}
数据的更新操作在ThinkPHP使用save方法进行保存更新数据,
Create方法创建表单提交数据。
更新条件其实就是表的主键,这就是我们在编辑页面要把主键的值作为隐藏字段一起提交的原因。
不依赖表单提交的更新操作:
$Form = M(“Form”);
// 要修改的数据对象属性赋值
$data[‘id’] = 5;
$data[‘title’] = “ThinkPHP”;
$data[‘content’] = ‘ThinkPHP3.1版本发布’;
$Form -> save($data); //根据条件保存修改的数据
Save方法会自动识别数据对象中的主健字段,并作为更新条件。
显示传入更新条件:
$Form = M(“Form”);
//要修改的数据对象属性赋值
$data[‘title’] = ‘ThinkPHP’;
$data[‘content’] = ‘ThinkPHP3.1版本发布’;
$Form -> where(‘id=5’)->save($data); //根据条件保存修改的数据
可以改成对象方式来操作:
$Form = M(“Form”);
//要修改的数据对象属性赋值
$Form->title = ’ThinkPHP’;
$Form->content = “ThinkPHP3.1版本发布”;
$Form->where(‘id=5’)->save();//根据条件保存修改的数据
数据对象赋值的方式,save方法无需传入数据,会自动识别。
Save方法的返回值是影响的记录数,如果返回false则表示更新出错。
有些时候,我们只需要修改某个字段的值,就可以使用setField方法,而不需要每次都调用save方法。
$Form = M(“Form”);
//更改title值
$Form -> where(‘id=5’) -> setField(‘title’,’ThinkPHP’);
对于统计字段,系统还提供了更加方便的setInc和setDec方法。
例如:
$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
五、删除数据
删除数据很简单,只需要调用delete方法,例如:
$Form=M(‘Form’);
$Form -> delete(5);
表示删除主键为5的数据,delete方法可以删除单个数据,也可以删除多个数据,这取决于删除条件,例如:
$User = M(“User”); //实例化User对象
$User -> where(‘id=5’)->delete(); //删除id为5的用户数据
$User -> delete(‘1,2,5’); //删除主键为1,2和5的用户数据
$User -> where(‘status=0’)->delete(); //删除所有状态为0的用户数据
Delete方法的返回值是删除的记录数,如果返回值是false则表示SQL出错,返回值如果为0表示没有删除任何数据。
六、总结
Create方法:创建数据
Add方法: 添加数据
Save方法: 保存数据
Delete方法:删除数据
getField方法:获取单个信息字段
setField方法:设置单个信息字段
ThinkPHP3快速入门教程二:数据CURD的更多相关文章
- ThinkPHP3快速入门教程-:基础
一.ThinkPHP的认识: ThinkPHP是一个快速.简单的基于MVC和面向对象的轻量级PHP开发框架. 二.下载后的目录结构: ├─ThinkPHP.php 框架入口文件 ├─Commo ...
- ThinkPHP3快速入门教程三:查询语言
一.查询语言简介: ThinkPHP内置了非常灵活的查询方法,可以快速的进行数据查询操作,查询条件可以用于读取.更新和删除等操作,主要涉及到where方法等连贯相关方法操作即可, 此框架查询系统可以解 ...
- Jmeter 快速入门教程(二)--创建简单web测试
[版权所有: whoistester.com & jmeter.cf] http://wenku.baidu.com/linkurl=9zc4VHe6vUUeMdDZPpNsRehkazZFw ...
- 2.Jmeter 快速入门教程(二)--创建简单web测试 打印 E-mail
今天我们就来实际用Jmeter创建一个测试场景,并进行性能测试. 注:由于本人使用中文版本,使用英文版本的请注意具体的菜单及参数名称. 1. 添加线程组(相当于lr里的scenario 设置) 打开j ...
- 无废话ExtJs 入门教程二十[数据交互:AJAX]
无废话ExtJs 入门教程二十[数据交互:AJAX] extjs技术交流,欢迎加群(521711109) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3C ...
- ThinkPHP3.1快速入门教程
ThinkPHP3.1快速入门教程 http://www.thinkphp.cn/info/155.html ------------------------------------------- ...
- MongoDb 快速入门教程
文章首发于[博客园-陈树义],点击跳转到原文MongoDb 快速入门教程. MongoDb 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 它是可扩展的 ...
- MySQL 快速入门教程
转:MySQL快速 入门教程 目录 一.MySQL的相关概念介绍 二.Windows下MySQL的配置 配置步骤 MySQL服务的启动.停止与卸载 三.MySQL脚本的基本组成 四.MySQL中的数据 ...
- EntityFramework6 快速入门教程
EntityFramework6 快速入门教程 不得不说EF在国内实在是太小众,相关的技术文章真实屈指可数,而且很多文章都很旧了,里面使用的版本跟如今的EF6差别还是比较大.我刚开始弄这个的时候真是绕 ...
随机推荐
- SubSonic3.0使用例子
前段时间开发的框架使用了SubSonic2.2以后,觉得开发效率提高了不少,后期维护起来也非常方便,不由的喜欢上了SubSonic.中间有想过升级到更高版本,但度娘一下就放弃了,只有极少的中文版说明, ...
- scikit-learn 支持向量机算法库使用小结
之前通过一个系列对支持向量机(以下简称SVM)算法的原理做了一个总结,本文从实践的角度对scikit-learn SVM算法库的使用做一个小结.scikit-learn SVM算法库封装了libsvm ...
- Objective-C中的集合类
下面详细的介绍Objective-C中的集合类以及每个集合类的用法,学过其他面向对象编程语言的小伙伴们看到OC的集合类会有种莫名的亲切感,理解起来问题不大,可以类比Java中的集合类去学习. 在Obj ...
- 转:Android随笔之——使用Root权限实现后台模拟全局按键、触屏事件方法(类似按键精灵)
本文转载自CSDN的jzj1993,原文连接:http://blog.csdn.net/jzj1993/article/details/39158865 有时我们需要使用安卓实现在后台模拟系统按键,比 ...
- 高级javascript---模块化编程
随着网站逐渐变成“互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂 网页越来越像桌面程序,需要一个团队分工协作.进度管理.单元测试等等......开发者不得不使用软 ...
- PHPStorm如何配置,phpstorm的mac配置文件目录
PHPStorm的配置分为2大类:项目配置和IDE配置. 项目配置(设置),主要是配置具体项目.IDE 配置(设置),通用的设置会应用到所有的项目上. 项目配置每个项目的配置存储在项目所在目录的 .i ...
- html5 meta(移动端)介绍及使用
随着高端手机(Andriod,Iphone,Ipod,WinPhone等)的盛行,移动互联应用开发也越来越受到人们的重视,用html5开发移动应用是最好的选择.然而,每一款手机有不同的分辨率,不同屏幕 ...
- 使用RMAN创建复制数据库
我的实验环境: - 源数据库A机: RHEL6.4 + Oracle 11.2.0.4 IP地址:192.168.99.159 db_name=oradb 数据库已正常运行 - 复制数据库B机: RH ...
- 做图表统计你需要掌握SQL Server 行转列和列转行
说在前面 做一个数据统计和分析的项目,每天面对着各种数据,经过存储过程从源表计算汇总后需要写入中间结果表以提高数据使用效率,那么此时就需要用到行转列和列转行. 1.列转行 数据经过计算加工后会直接生成 ...
- Entity Framework Model First下改变数据库脚本的生成方式
在Entity Framework Model First下, 一个非常常见的需求是改变数据库脚本的生成方式.这个应用场景是指,当用户在Designer上单击鼠标右键,然后选择Generate Dat ...