# 直接读取数据之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) |