Day18-從基礎學習 ThinkPHP-Model 基礎操作(4)

前言

haha我像荒唐鏡一樣跳走了,現在又跳回來了打我啊笨蛋(被扁),接下來這邊會針對查詢稍微做一下補充,例如該如何使用 Model 條件式查詢,查詢之後又該如何排序呢?

前世

先讓我們回到前世,阿不是,先讓我們回顧一下前面的 Model 基礎操作,我們理解可以使用 get()、all() 來做單一查詢 or 列出資料清單:

1
2
3
$user = aboutModel::get($id);

$user = aboutModel::all();

但是 Model 基礎操作 系列卻沒有講到條件與排序的動作,所以這邊將會介紹其他的 Model 基礎操作。

條件式查詢

接下來的範例我會將程式碼撰寫於 about/controller/index.php 中。

經過前兩篇的資料操作系列,我們可以理解到如果使用 Model 操作資料是一件多麼方便的事情,所以這邊將會介紹該如何使用 Model 的條件式查詢,其實也就是帶上 where() 方法而已,但是這邊將會搭配使用前面所學的資料操作技巧,也就是構造器。

那麼首先我這邊舉例我要篩選 user 資料表中班上同學的身高,然後我要找身高大於 170 公分的同學:

1
2
$user = aboutModel::where('height', '>', 170)->select();
echo $user;

那麼結果就會像這樣子是一個陣列物件 ↓

陣列物件

當然也可以不使用構造器的方式來製作條件篩選,也就是使用 all() 方法來製作:

1
2
$user = aboutModel::all(['name' => 'QQ先生']);
echo $user;

回傳陣列

使用 all() 方法去做條件篩選的方式是帶入陣列條件,但是如果想要查詢多筆資料呢?用 all() 可不可以?

1
2
$user = aboutModel::all(['name' => 'QQ先生','name' => '王小明']);
echo $user;

那我們就直接來看查詢後的結果 ↓

QQ 先生消失了

所以由此可知,如果想要做比較複雜的條件查詢,那麼我會建議使用構造器去撰寫,你也會比較直覺且好維護。

刪除資料

接下來這邊將會講解刪除方法的使用方式,也就是 delete(),在使用刪除方法時,建議請依照主鍵也就是 key 來做判斷,否則可能會發生誤刪資料的事件,那麼刪除方的法非常簡單:

1
2
$user = aboutModel::get($id);
$user->delete();

你沒有看錯就是這麼簡潔,當你成功刪除後 delete() 將會回傳一個布林值 (true or false),所以我們可以依照它回傳的值進而判斷是否刪除成功:

1
2
3
4
5
6
$user = aboutModel::get($id);
if ($user->delete()) {
return '刪除成功'.$user->id;
} else {
return $user->getError();
}

那麼我這邊路由已經先註冊好了 Route::get('/about/delete/:id', 'about/index/delete');,接下來直接訪問路由就可以直接刪除特定的資料,例如我現在想要刪除 [QQ 先生] ↓

刪除成功

當然我們也可以來看一下資料表確定 QQ 先生真的已經被刪除了 ↓

QQ 先生真的 QQ 了

輸出 JSON

最後這邊補充輸出 JSON 格式的方式,這邊我將會使用 all() 方法來撰寫,另外由於現在前後端分離的關係,現在大多都是採用 API 開發輸出 JSON 格式,所以 JSON 格式的輸出就格外的重要,但是寫法其實也很簡單,因為 ThinkPHP 本身也有提供該方法,只需要這樣寫即可:

1
2
$user = aboutModel::all();
return $user->toJson();

另外 ThinkPHP 也有更簡潔的寫法,但是簡潔寫法本身呢…就是原本的寫法,原本寫法就是輸出 JSON 格式:

1
2
$user = aboutModel::all();
return $user;

但是我覺得這邊還是告知一下有這種寫法會比較好。

結尾

最後如果你有發生 rying to get property 'name' of non-object 的錯誤訊息,那代表是我前面章節的路由註冊上較不妥的關係,主要是這一隻路由導致錯誤:

1
Route::get('/about/:id', 'about/index/select');

你只需要將路由修改成以下就可以解決囉~

1
Route::get('/about/select/:id', 'about/index/select');