--- tags: PHP / Laravel / Lumen --- # Laravel CRUD實作(上) ### 本篇介紹 > 本篇將開始透過實作blog來熟悉Laravel開發模式,以建立基本開發能力。本次實作將使用Laravel 5.8,請先確認PHP版本 >=7.1.3,且Apache與MySQL服務皆已開啟,再進行以下操作 ### 前言 本篇開始的實作都將涉及PHP、物件導向概念,並參雜HTML、JavaScript,無接觸經驗者請迴避 今天要帶各位實作部落格的文章CRUD (Create、Read、Update、Delete),即新增、查詢、修改、刪除。而之前有提到Laravel使用的是MVC架構,並使用framework提供的套件,因此程式碼的寫法與開發模式,會與撰寫傳統PHP有很大的不同。 注意專案中的「.env」是否已修改 ``` DB_DATABASE=blog DB_USERNAME={your db user} DB_PASSWORD={your db password} ``` 修改時區 (config\app.php) ```php 'timezone' => 'Asia/Taipei', ``` 而一篇文章至少需記錄「標題」與「發文內容」,所以我們需要一張文章的資料表,但以前都得逐一設定欄位的名稱與其他屬性,或利用SQL語句的「CREATE TABLE ...」建立資料表,相當麻煩,因此Laravel使用「migration」(資料遷移檔) 進行資料表的建構。這時利用Command輸入: ``` $ php artisan make:model Entities/Post -m ``` * 這項指令會為我們建立名為「Post」的model,而「-m」表示建立model的同時,也產生該資料表的migration,原則上一張表對應一個model。 此時我們會看到 app\Entities 與 database\migrations 底下,分別多了「Post.php」與 migration (檔名開頭為今天日期),這時打開 migration 定義文章資料表的結構 model預設會被建立在app資料夾底下,但我們將它額外建立在「Entities」資料夾,因為在MVC架構中,我們會利用資料表的實體對資料表進行存取,因此在這裡將model分類在Entity(實體) ```php public function up() { Schema::create('posts', function (Blueprint $table) { $table->increments('id'); $table->unsignedInteger('user_id'); $table->string('title'); $table->string('content'); $table->timestamps(); }); } ``` 小括號內為資料表欄位名稱,前面的 string 與 unsignedInteger 為欄位型別。而你能為欄位修飾屬性,如「允許空白」、「唯一」、「索引」或「預設值」 * 預設主鍵為id,它是每筆資料的流水號,新增資料時由資料表自動產生 * timestamps為時間戳記,預設自動產生資料的建立時間(created_at)與更新時間(updated_at) ```php $table->string('XXX_1')->nullable(); $table->string('XXX_2')->unique(); $table->string('XXX_3')->index(); $table->integer('XXX_4')->default(1); ``` 但不知道各位有沒有發現到一件事,我們的model為「Post」,為何資料表是「posts」呢?原因是: * model本身是個類別,所以採「大駝峰」命名,且名稱最後不加s * 資料表命名規則為:table名稱小寫,並轉為複數型態 (posts) migration定義完成後,在command輸入以下指令,即可自動幫我們在資料庫建構資料表 ``` $ php artisan migrate ``` 然而Laravel 5.4以後,執行migrate可能會遇到如:max key legnth...的問題,只要在app\Providers\AppServiceProvider.php 中 boot 方法加入下列程式碼,並引入Schema即可 ```php namespace App\Providers; use Illuminate\Support\Facades\Schema; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { /** * Bootstrap any application services. * * @return void */ public function boot() { Schema::defaultStringLength(191); } # 略 } ``` 再執行以下指令 ``` php artisan migrate:fresh ``` 回到資料庫就能看到資料表已經建立好了!是不是方便多了呢? * 執行migrate時,會依據資料庫中的migrations資料表,與本地的database\migrations進行比對,檢查migration有無異動 * migrate:fresh 將會回推所有migration,並重新執行資料遷移,舊有資料將不被保留