---
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,並重新執行資料遷移,舊有資料將不被保留