# 直接读取数据之Db
本节我们开始解决`成功连接数据库后如果查询teacher数据表`的问题。ThinkPHP大体上提供了两种与数据库交互的的方案,分别为:使用Db类进行读取以及借助模型进行读取。本小节我们介绍第一种:使用Db类进行读取。
# Db类
面象对向的世界与人类共同营造的世界一样丰富多彩,人类细化分工、协作生产,达到当前高度的文明。面象对象也同样如此,各个对象细化分工、协作生产。与人类世界不同的是,面象对象中的每个对象都是活雷锋,不仅有求必应,而且分文不收。
ThinkPHP中的Db类就是这样一个对象(类),它住在`\think\facade`,当我们想找它帮忙时叫它一下就好:
```php
\think\facade\Db
```
该代码的作用是:找住`\think\facade\`中的`Db`来帮忙。在面向对象的世界中,我们这个代表住在哪的`\think\facade\`又称为`命名空间`,每个`命名空间`下可以有多个类,每个类的名字的在当前`命名空间`下都是唯一的。
只所以这样做,是为了解决重名的问题。这就像现实生活中,住在王家村的李家有两个孩子分别叫李刚和李强,住在孔楼村的李家也有两个孩子,也叫李刚和李强。那么此时如果想找孔楼村的李刚帮忙,则使用以下代码:
```php
\孔楼村\李刚
```
而想找王家村的李刚帮忙,则使用以下代码:
```php
\王家村\李刚
```
这保证了每个村都可以有一个李刚,而在调用过程中又可以指定调用的具体是哪个李刚。
>[warning] 在教程中,我们有时候会淡化对象与类的不同。
# Db::query
Db类提供的了一个名为query的方法,我们可以直接利用该方法来运行sql语句进行相关数据的查询。
> Db是Database的缩写,意为数据库;query译为查询。
```php
public function index()
{
// think镇facade村的Db提供了一个query方法,调用该方法可以进行数据查询
// 使用select * from yunzhi_teacher查询数据库
❶ $teachers = \think\facade\Db::query('select * from yunzhi_teacher');
// 调用tp提供的dump方法,友好的输出查询结果
❷ dump($teachers);
}
```
* ❶ php规定,变量名称必须与`$`打头,此处的`$teachers`代表定义了一个普通变量,变量名为`teachers`。
* ❷ `dump`是ThinkPHP提供的一个友好的查看输出结果的方法。对是php原生函数`var_dump`方法的封装。
讲了这么多,相信再看上节的测试代码应该有不一样的感受了吧。
# 二维数组
![](https://img.kancloud.cn/3b/fe/3bfecfd9bb2cbdb0c3a5776214676ee9_375x402.png)
解释一下输出的结果:
```
// 变量类型是个array,即数组,“array:2”表示这个数组中有两个子项。
^ array:2 [▼
// 键值为0的值是一个数组,这个数组中有7个子项
0 => array:7 [▼
"id" => 1 // 键值为id的值为1,数字类型
"name" => "张三" // 键值为name的值为 张三,是string类型
"sex" => 0
"username" => "zhangsan"
"email" => "zhangsan@mail.com"
"create_time" => 123123
"update_time" => 123213
]
1 => array:7 [▼
"id" => 2
"name" => "李四"
"sex" => 0
"username" => "lisi"
"email" => "lisi@yunzhi.club"
"create_time" => 123213
"update_time" => 1232
]
]
```
通过`dump()`方法,我们可以轻松的查看到变量的类值、结构、变量值。数据的结构非常直观的展示在了我们面前。如果从数据结构的角度上来,上述结构是一个典型的树状结构。
![](https://box.kancloud.cn/2016-06-13_575e5bec37c1d.png)
当我们想输出teachers中的0号元素时:
```php
public function index()
{
// think镇facade村的Db提供了一个query方法,调用该方法可以进行数据查询
// 使用select * from yunzhi_teacher查询数据库
$teachers = \think\facade\Db::query('select * from yunzhi_teacher');
// 调用tp提供的dump方法,友好的输出查询结果
dump($teachers);
dump($teachers[0]);
}
```
当我们想输出teachers中0号元素的name值时:
```php
// 调用tp提供的dump方法,友好的输出查询结果
dump($teachers[0]['name']);
```
当然了,如果变量的类型是字符串,那么我们还可以使用echo语句来替换dump方法:
```php
// 调用tp提供的dump方法,友好的输出查询结果
dump($teachers[0]['name']);
echo $teachers[0]['name'];
```
![](https://img.kancloud.cn/4b/dc/4bdc6c173933318b33e514ecb48aebfe_391x404.png)
测试结果如上
# 本节作业
1. 使用`var_dump`来替换`dump`,观察下两者的不同。
2. 在chrome中查看页面源代码,再次观察`var_dump`与`dump`方法的不同。
# 相关资源
| 内容 | 地址 |
| ----------- | ----------- |
| 查询数据 | [https://www.kancloud.cn/manual/thinkphp6_0/1037533](https://www.kancloud.cn/manual/thinkphp6_0/1037533)|
| 本节源码 | [https://github.com/mengyunzhi/tp6/archive/step2.2.3.zip](https://github.com/mengyunzhi/tp6/archive/step2.2.3.zip) |
- 序言
- 第一章 Hello World
- 1.1 运行环境
- 1.1.1 windows
- 1.1.2 macos
- 1.1.3 ubuntu
- 1.2 Hello ThinkPHP
- 1.2.1 windows
- 1.2.2 macos
- 1.2.3 ubuntu
- 2.3 Hello World
- 第二章 教师管理
- 2.1 数据库初始化
- 2.2 CRUD之 R 读取数据
- 1 数据流
- 2.2.2 连接数据库
- 2.2.3 直接读取数据之DB
- 2.2.4 间接读取数据之模型
- 2.2.5 显示数据之原始文案
- 2.2.6 单引号与双引号
- 2.2.7 显示数据之视图
- 2.2.8 模板语法
- 2.2.9 使用bootstrap美化界面
- 2.3 CRUD之 C 增加数据
- 2.3.1 MCA默认路由