實作資料庫以及新建動物的方法

實作資料庫

昨天有規劃一下資料表欄位,所以今天就來實作它吧!還記得在產生 Model 的時候有新增了一個 Migration ,這個東西可能一開始不太知道是什麼,它是一個可以把建立資料表這件事交由程式碼的檔案,迅速的創建好需要的資料表。如果是多人共同開發的時候,可以方便拿到最新版的資料庫。

/animal/database/migrations/2019_08_22_201730_create_animals_table.php

檔案已經包含 updown 兩個方法,表示跑這個檔案的時候,會執行 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 方法(再放一次路由的列表提供你參考)

MethodURINameActionMiddleward
POST/api/animalanumal.storeApp\Http\Controllers\AnimalController@storeapi

請求動作是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 程式

填一些基本資料

  1. 開啟一個頁籤
  2. 選擇 POST
  3. 輸入請求網址 127.0.0.1:8000/api/animal
  4. 選擇 Headers 頁籤
  5. 加入 key value 如圖顯示

接下來填寫請求的Body資料,如下圖。(欄位都要填喔!沒有填會有錯誤,我們目前只撰寫創建的程式碼,沒有檢查請求的欄位是否必填之類的程式。)

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

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

來看看資料庫有沒有資料

Victor
Victor

哈囉!

文章: 221

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *