thinkPHP学习笔记之数据库操作(二)

栏目: PHP · 发布时间: 6年前

内容简介:thinkPHP学习笔记之数据库操作(二)

上一节写了关于TP的一些概念,这一节主要记录对数据库的CURD操作。

看完官方文档顿时感觉TP对数据操作API的封装是如此的强大,对于查询语句这一参数就支持 数组字符串对象 这三种方式。

数据库的操作是由模型来管理的,首先先谈一谈模型相关。

模型

模型类的作用大多数情况是操作数据表的,如果按照系统的规范来命名模型类的话,大多数情况下是可以用模型的名字自动对应数据表的。

模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写,然后加上模型层的名称(默认定义是Model),例如:

模型名 约定对应数据表(假设数据库的前缀定义是 think_)
UserModel think_user
UserTypeModel think_user_type

如果你的规则和上面的系统约定不符合,那么需要设置Model类对应的数据表名称,可以通过模型对象调用table方法指定数据库表名,以确保能够找到对应的数据表。

1.TP是通过数据模型实例化对象来操作对应的数据表的,对于模型类并非必须要创建对应的类,只有当存在独立的业务逻辑或者属性的时候才需要定义。

2.正如控制器类一样,所有的的模型类都继承自TP的Model或其子类。

3.对于模型类这一块你可以大致的看一下就行,实战的时候你会发现你基本上不用去创建模型类,直接用M函数就搞定了.

直接实例化(请忽略我 o(╯□╰)o )

可以和实例化其他类库一样实例化模型类,例如:

$User = new /Home/Model/UserModel(); $Info = new /Admin/Model/InfoModel(); // 带参数实例化 $New  = new /Home/Model/NewModel('blog','think_',$connection)

快速实例化(着重看)

TP提供了快捷实例化模型的API,上面的直接实例化的时候我们需要传入完整的类名,系统提供了一个快捷方法D用于数据模型的实例化操作。

要实例化自定义模型类,可以使用下面的方式:

M方法

<a>M('[基础模型名:]模型名',['数据表前缀'],['数据库连接信息'])

一般我们只需要传第一个参数,后两个参数基本上不写,因为我们会在配置文件中写

</a>

D方法实例化模型类的时候通常是实例化某个具体的模型类,如果你仅仅是对数据表进行基本的CURD操作的话,使用M方法实例化的话,由于不需要加载具体的模型类,所以性能会更高。

例如:

// 使用M方法实例化 //参数:数据表名,不包括数据表前缀 $User = M('User'); // 和用法 $User = new /Think/Model('User'); 等效 // 执行其他的数据操作 $User->select();

M方法也可以支持跨库操作,例如:

// 使用M方法实例化 操作db_name数据库的ot_user表 $User = M('db_name.User','ot_'); // 执行其他的数据操作 $User->select();

如果你的模型类有自己的业务逻辑,M方法是无法支持的,就算是你已经定义了具体的模型类,M方法实例化的时候是会直接忽略。

D方法

<a> D('[项目://][分组/]模型','模型层名称') </a>

方法的返回值是实例化的模型对象

<?php //实例化模型 $User = D('User'); // 相当于 $User = new /Home/Model/UserModel(); // 执行具体的数据操作 $User->select();  //D方法还可以支持跨模块调用,需要使用: //实例化Admin模块的User模型(admin是默认的home目录等级的) D('Admin/User');

实例化空模型类

如果你仅仅是使用原生 SQL 查询的话,不需要使用额外的模型类,实例化一个空模型类即可进行操作了,例如:

//实例化空模型,Model是TP框架提供Model基类 $Model = new Model(); //或者使用M快捷方法是等效的 $Model = M(); //进行原生的SQL查询 $Model->query('SELECT * FROM think_user WHERE status = 1');

实例化空模型类后还可以用table方法切换到具体的数据表进行操作,我们在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法实例化模型无需用户为每个数据表定义模型类,如果D方法没有找到定义的模型类,则会自动调用M方法。

数据的写入

向user数据表中写入一条数据

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

数据的查询

(1)读取数据集

读取数据表中的一行数据(或者关联数据),主要通过 find 方法完成,例如:

$User = M("User"); // 实例化User对象 // 查找status值为1 name值为think的用户数据  //where方法的参数可以是数组、字符串、对象,建议用数组形式 $data = $User->where('status=1 AND name="thinkphp"')->find(); dump($data);

find方法查询数据的时候可以配合相关的连贯操作方法,其中最关键的则是where方法。

如果查询出错,find方法返回false,如果查询结果为空返回NULL,查询成功则返回一个关联数组(键值是字段名或者别名)。

<a>即使满足条件的数据不止一个,find方法也只会返回第一条记录(可以通过order方法 排序 后查询)。</a>

还可以用data方法获取查询后的数据对象(查询成功后)

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

(2)读取数据集

读取数据集其实就是获取数据表中的多行记录(以及关联数据),使用select方法,使用示例:

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

如果查询出错,select的返回值是false,如果查询结果为空,则返回NULL,否则返回二维数组。

(3)读取字段值

读取字段值其实就是获取数据表中的某个列的多个或者单个数据,最常用的方法是 getField方法。

示例如下:

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

默认情况下:当只有一个字段的时候,返回数据表中满足条件的数据集的第一行的该字段的值。

如果需要返回整个列的数据,可以用:

// 使用M方法实例化 //参数:数据表名,不包括数据表前缀 $User = M('User'); // 和用法 $User = new /Think/Model('User'); 等效 // 执行其他的数据操作 $User->select();

0

这样返回的list是一个数组,键名是用户的id字段的值,键值是用户的昵称nickname。

如果传入多个字段的名称,例如:

// 使用M方法实例化 //参数:数据表名,不包括数据表前缀 $User = M('User'); // 和用法 $User = new /Think/Model('User'); 等效 // 执行其他的数据操作 $User->select();

1

//返回的数组格式是array( id =>array( id =>value, nickname =>value, email =>value))是一个二维数组,key还是id字段的值,但value是整行的array数组,类似于select()方法的结果遍历将id的值设为数组key

返回的是一个二维数组,类似select方法的返回结果,区别的是这个二维数组的键名是用户的id(准确的说是getField方法的第一个字段名)。

如果我们传入一个字符串分隔符:

// 使用M方法实例化 //参数:数据表名,不包括数据表前缀 $User = M('User'); // 和用法 $User = new /Think/Model('User'); 等效 // 执行其他的数据操作 $User->select();

2

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

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

// 使用M方法实例化 //参数:数据表名,不包括数据表前缀 $User = M('User'); // 和用法 $User = new /Think/Model('User'); 等效 // 执行其他的数据操作 $User->select();

3

可以配合使用order方法使用。

数据的更新

更新一条或多条记录用save

更新数据使用save方法,例如:

// 使用M方法实例化 //参数:数据表名,不包括数据表前缀 $User = M('User'); // 和用法 $User = new /Think/Model('User'); 等效 // 执行其他的数据操作 $User->select();

4

也可以改成对象方式来操作:

// 使用M方法实例化 //参数:数据表名,不包括数据表前缀 $User = M('User'); // 和用法 $User = new /Think/Model('User'); 等效 // 执行其他的数据操作 $User->select();

5

数据对象赋值的方式,save方法无需传入数据,会自动识别。

注意:save方法的返回值是影响的记录数,如果返回false则表示更新出错,因此一定要用恒等来判断是否更新失败。

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

因此下面的代码不会更改数据库的任何记录

// 使用M方法实例化 //参数:数据表名,不包括数据表前缀 $User = M('User'); // 和用法 $User = new /Think/Model('User'); 等效 // 执行其他的数据操作 $User->select();

6

<a>要修改的数据必须要有条件或者主键</a>

除非使用下面的方式(假如id字段是主键):

// 使用M方法实例化 //参数:数据表名,不包括数据表前缀 $User = M('User'); // 和用法 $User = new /Think/Model('User'); 等效 // 执行其他的数据操作 $User->select();

7

字段和数据过滤

和add方法一样,save方法支持使用field方法过滤字段和filter方法过滤数据,例如:

// 使用M方法实例化 //参数:数据表名,不包括数据表前缀 $User = M('User'); // 和用法 $User = new /Think/Model('User'); 等效 // 执行其他的数据操作 $User->select();

8

当使用field('email')的时候,只允许更新email字段的值(采用strip_tags方法过滤),name字段的值将不会被修改。

还有一种方法是通过create或者data方法创建要更新的数据对象,然后进行保存操作,这样save方法的参数可以不需要传入。

// 使用M方法实例化 //参数:数据表名,不包括数据表前缀 $User = M('User'); // 和用法 $User = new /Think/Model('User'); 等效 // 执行其他的数据操作 $User->select();

9

使用create方法的例子:

// 使用M方法实例化 操作db_name数据库的ot_user表 $User = M('db_name.User','ot_'); // 执行其他的数据操作 $User->select();

0

更新字段

如果只是更新个别字段的值,可以使用 setField 方法。

使用示例:

// 使用M方法实例化 操作db_name数据库的ot_user表 $User = M('db_name.User','ot_'); // 执行其他的数据操作 $User->select();

1

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

// 使用M方法实例化 操作db_name数据库的ot_user表 $User = M('db_name.User','ot_'); // 执行其他的数据操作 $User->select();

2

而对于统计字段(通常指的是数字类型)的更新,系统还提供了 setIncsetDec 方法。

// 使用M方法实例化 操作db_name数据库的ot_user表 $User = M('db_name.User','ot_'); // 执行其他的数据操作 $User->select();

3

3.2.3版本开始,setInc和setDec方法支持延迟更新,用法如下:

// 使用M方法实例化 操作db_name数据库的ot_user表 $User = M('db_name.User','ot_'); // 执行其他的数据操作 $User->select();

4

数据的删除

ThinkPHP删除数据使用delete方法,例如:

// 使用M方法实例化 操作db_name数据库的ot_user表 $User = M('db_name.User','ot_'); // 执行其他的数据操作 $User->select();

5

表示删除主键为5的数据,delete方法可以删除单个数据,也可以删除多个数据,这取决于删除条件,例如:

// 使用M方法实例化 操作db_name数据库的ot_user表 $User = M('db_name.User','ot_'); // 执行其他的数据操作 $User->select();

6

delete方法的返回值是删除的记录数,如果返回值是false则表示SQL出错,返回值如果为0表示没有删除任何数据。

也可以用order和limit方法来限制要删除的个数,例如:

// 使用M方法实例化 操作db_name数据库的ot_user表 $User = M('db_name.User','ot_'); // 执行其他的数据操作 $User->select();

7

为了避免错删数据,如果没有传入任何条件进行删除操作的话,不会执行删除操作,例如:

// 使用M方法实例化 操作db_name数据库的ot_user表 $User = M('db_name.User','ot_'); // 执行其他的数据操作 $User->select();

8

不会删除任何数据,如果你确实要删除所有的记录,除非使用下面的方式:

// 使用M方法实例化 操作db_name数据库的ot_user表 $User = M('db_name.User','ot_'); // 执行其他的数据操作 $User->select();

9

附录:

1、常用API详解文档


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

妙趣横生的算法(C++语言实现)

妙趣横生的算法(C++语言实现)

胡浩 / 清华大学出版社 / 2014-10-1 / 59.80元

《妙趣横生的算法(C++语言实现)》内容丰富,生动有趣,寓教于乐,旨在帮助读者学习数据结构和算法的相关知识,从而开阔眼界,培养编程兴趣,提高编程能力,增强求职的竞争力。如果您想提高自己对算法和数据结构的理解能力,在程序设计之路上走得更远,那么请翻开《妙趣横生的算法(C++语言实现)》,仔细研读吧,它将助您一臂之力。 《妙趣横生的算法(C++语言实现)》以通俗易懂的语言深入浅出地介绍了常用的数......一起来看看 《妙趣横生的算法(C++语言实现)》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具