實作資料庫
昨天有規劃一下資料表欄位,所以今天就來實作它吧!還記得在產生 Model 的時候有新增了一個 Migration ,這個東西可能一開始不太知道是什麼,它是一個可以把建立資料表這件事交由程式碼的檔案,迅速的創建好需要的資料表。如果是多人共同開發的時候,可以方便拿到最新版的資料庫。
/animal/database/migrations/2019_08_22_201730_create_animals_table.php
檔案已經包含 up
、 down
兩個方法,表示跑這個檔案的時候,會執行 up 寫好的內容,如果恢復資料庫時會跑 down 的方法
class CreateAnimalsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('animals', function (Blueprint $table) { $table->bigIncrements('id'); $table->unsignedInteger('type_id')->comment('動物分類'); $table->string('name')->comment('動物的暱稱'); $table->date('birthday')->nullable()->comment('生日'); $table->string('area')->nullable()->comment('所在地區'); $table->boolean('fix')->default(false)->comment('結紮情形'); $table->text('description')->nullable()->comment('簡單敘述'); $table->text('personality')->nullable()->comment('動物個性'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('animals'); } }
上面的程式欄位設定,可以參考官網的說明 https://laravel.com/docs/5.8/migrations#columns
程式寫完以後,讓我們來跑跑看是否成功,嘗試之前要把資料庫安裝好,還有設定好環境變數檔案。
打開根目錄的 .env
DB_CONNECTION=mysql #你用的資料庫類別 DB_HOST=127.0.0.1 #資料庫裝在哪裡 DB_PORT=3306 #PORT號 mysql 預設 3306 DB_DATABASE=animal #新建一個要來存放資料表的資料庫,把資料庫名稱填在這邊 DB_USERNAME=root #可以操作這個資料庫的帳號 DB_PASSWORD=1234 #該帳號的密碼
好!以上設定完成以後!要在資料庫伺服器裡面新增 animal
資料庫名稱(這邊的animal 是資料庫名稱,migration 檔案運行後產生的是 animals 資料庫內的資料表),建立好後這個空空蕩蕩的資料庫,來看看下完指令後的變化吧!請執行下方指令~
C:\project\animal\ > php artisan migrate
跑出這樣的結果

然後再去看看資料庫
運行前空蕩蕩

運行後

應該有多了一些資料表其中包含 animals
恭喜你成功了! 最基本的配置都已經完成了!要來正式開始寫操作功能
新建動物的方法
還記得昨天產生的三個檔案嗎?打開 AnimalController
裡面應該已經會有很多內容 不過不要害怕有我在
現在來打造新建一筆動物資料的動作,因為 Laravel 內建的 apiResource 已經配置相對應的方法,所以我省掉不少事情,我們找到 store
方法(再放一次路由的列表提供你參考)

Method | URI | Name | Action | Middleward |
POST | /api/animal | anumal.store | App\Http\Controllers\AnimalController@store | api |
請求動作是POST,請求網址 api/animal 他對應到的 AnimalController 裡面的 store 方法
AnimalController (Controller)
use App\Animal; use Symfony\Component\HttpFoundation\Response; public function store(Request $request) { //Animal Model 有 create 寫好的方法,把請求的內容,用all方法轉為陣列,傳入 create 方法中。 $animal = Animal::create($request->all()); // 回傳 animal 產生出來的實體物件資料,第二個參數設定狀態碼,可以直接寫 201 表示創建成功的狀態螞或用下面 Response 功能 return response($animal, Response::HTTP_CREATED); }
Animal (Model)
class Animal extends Model { /** * 可以被批量賦值的屬性。 * * @var array */ protected $fillable = [ 'type_id', 'name', 'birthday', 'area', 'fix', 'description', 'personality', ]; }
為什麼要設定 $fillable? 因為像AnimalController
這樣的撰寫方式,把整個使用者請求的陣列直接用create 的方法寫入,會有安全性的問題,所以必須用 $fillable
來限制哪些欄位可以被批量寫入。
假設今天是User被創建的動作,如果沒有這一層的保護,使用者的請求如果有包含權限的欄位值,就可以把User設定成管理員的權限。
嘗試可不可以運行
接下來開啟 Postman 程式
填一些基本資料

- 開啟一個頁籤
- 選擇 POST
- 輸入請求網址 127.0.0.1:8000/api/animal
- 選擇 Headers 頁籤
- 加入 key value 如圖顯示
接下來填寫請求的Body資料,如下圖。(欄位都要填喔!沒有填會有錯誤,我們目前只撰寫創建的程式碼,沒有檢查請求的欄位是否必填之類的程式。)

按下送出 Send 以後如果都正確會看到以下內容

可以看到右上角 Status:201 Created,並且有回傳該物件的內容!表示成功囉!恭喜!
來看看資料庫有沒有資料
