# 直接讀取數據之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`方法的封裝。
講了這么多,相信再看上節的測試代碼應該有不一樣的感受了吧。
# 二維數組

解釋一下輸出的結果:
```
// 變量類型是個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()`方法,我們可以輕松的查看到變量的類值、結構、變量值。數據的結構非常直觀的展示在了我們面前。如果從數據結構的角度上來,上述結構是一個典型的樹狀結構。

當我們想輸出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'];
```

測試結果如上
# 本節作業
1. 使用`var_dump`來替換`dump`,觀察下兩者的不同。
2. 在chrome中查看頁面源代碼,再次觀察`var_dump`與`dump`方法的不同。
# 相關資源
| 內容 | 地址 |
| ----------- | ----------- |
| 查詢數據 | [http://www.hmoore.net/manual/thinkphp6_0/1037533](http://www.hmoore.net/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默認路由