今天會介紹laravel一些簡單的指令
以及建立路由還有CRUD方法
跟資料庫連線喔!!
在開始實作之前我們先把env連線資料庫開好吧!!
首先我們要先把xampp裡面mysql打開來
接者在laravel的.env檔 把資料庫連線設定好
xampp的預設帳號密碼是root密碼為空白
接者database可以使用mysqlworkbench或是phpmysqmin建立
編碼可以使用utf8-unicode
這邊就不做說明了
想先跟大家分享我在建立laravel新的物件CRUD時習慣的流程
PS 不一定要跟我一樣但是我習慣這樣的做法原因會在後面補充!!
比如說: 有些人習慣先建migration 在建立model再來controller最後在route
順序沒有對錯但是只要啟動serve前所有的資料相依跟function路徑正確即可喔!!
這邊會依照順序是laravel convention影響(也就是透過你的指令命名會影響到MVC的相依姓)
首先我會先建立model並且建立資料表!!
這時候可以先下
php artisan make:book --migration
PS 這邊給大家一個觀念model習慣單數!!
或是可以使用-mc 建立migration +controller
但這邊我建議只要附加migraion就好C可以拿掉
因為建立controller時有更好的方式 !!!
就是加resource參數(會一次幫你把CRUD都建好)
接者因為我們建立好model並且有使用參數建立好migration
可以打開路徑app/database/migrations裡面的
create_books_table.php檔案(通常前面會加建立migration的時間戳)
PS這邊請看migration會自動建立books的檔案名稱以及裡面資料表名稱也叫做books複數形式
這個是laravel的慣例用法
如果是習慣先建立migraion的人
在建立model也可以
但是如果model跟資料表名稱不一樣時
要記得在model裡面修改你要指定的資料表名稱喔
EX 比如說這邊model叫做books 你的資料庫叫做my_books
那麼必須要增加以下這行
protected $table = 'my_books';
完整的model應該會長這樣
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'my_books';
};
如果是照我的流程走就不需要這樣做喔!!
接者各位看一下這張圖
我們可以看到第一個就是function up跟function down
這個是什麼意思呢?
可以把他想像laravel 在做資料庫的建立,修改欄位,刪除表單。。。。等
都會透過migration檔案來控管版本(就是資料表版的git)
up就是你要針對資料表的操作
dowm就是你要回朔操作的方法
EX:
如果你的up是create table那麼down就是drop table
如果你的up是新增資料表中的欄位 那麼down就是drop column
這邊我們就在id的下面新增一個string的字串型態並且欄位名稱叫做title
好了之後就下指令進行migtaion吧
php artisan migrate
通常如果出現錯誤都是資料欄位設定異常喔!!
好了之後可以透過GUI打開來看是否table有建立成功
這邊比較簡單
我們可以使用
php artisan make:BookController --resource
來建立book的controller記得model關鍵字要大寫喔
並且增加resource參數
可以使你的laravel controller幫你建立好CRUD方法詳細可以看我前一頁的對照表!!
接者我們可以在
路徑routes資料夾底下的web.php打開
這邊就是設定laravel route的地方
我們這邊在最後新增
Route::resource('books','BookController');
如此一來laravel就可以針對 path是books的進行controller的CRUD對應function
PS新版的laravel請注意(laravel 8版)
請把app/Providers/RouteServiceProvider.php打開
並且第29行的
protected $namespace = 'App\\Http\\Controllers';
註解取消,如果沒有請補上這行
這個程式碼是為了讓路由找到controller
非常重要不然會出錯喔!!
在撰寫controller前
我們先進app/Models/Book.php檔案
我們把
protected $fillable = ['title', 'author'];
補上
這個功能是為了讓mass assignment 成功!(前端資料自動map Model的key-value)
這是什麼意思呢
比如說前端傳一大堆json
這時laravel會自動幫你把前端的key對應value建立物件
就不需要一個個屬性指定喽
一個個指定要這樣做
$book = new BOOK;
$book->title = $request->title;
$book->author = $request->author;
$book->save();
mass assignment可以這樣做
$books = Book::create(request()->all())
那回到為什麼要增加$fillable屬性
這是怕前端有傳一些不必要的值導入資料庫
那麼我只限定title,author這兩個屬性可以處理
id跟日期我要自行處理
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Book extends Model
{
use HasFactory;
protected $fillable = ['title', 'author'];
}
接者還有一個設定要請各位打開來
就是
app/Http/Middleware/VerifyCsrfToken.php
裡面的程式碼我們改成
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
class VerifyCsrfToken extends Middleware
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
//
'*'
];
}
這個 星號 是為了laravel在form data傳送時會驗證csrf token
我們可以先使用這方法略過否則create跟update會失敗喔!!
接者就進入主軸拉
我們打開app/http/controllers/bookcontroller.php
先在use Illuminate\Http\Request;
新增
use App\Models\Book;
因為我們需要使用這個model的靜態方法
接者我們可以看到因為加上resouece參數建立好的一大堆function
首先
這邊真正存到資料庫是store 而不是create喔!!
因為laravel create預設是給使用者導向填表單的view
不過我們這邊直接使用postman沒有view所以跳過create function
進到store function
public function store(Request $request)
{
//
$books = Book::create(request()->all()) ;
return response($books);
}
這邊使用laravel create的方法
透過request把前端傳過得來的值
我們這邊可以使用all()把所有屬性指定出來
這樣$books的物件就建立好喽!!
create是laravel新版方法,舊版還需要使用save()
接者return 回去給前端看看成功的資料
這邊輸入post方法
path: localhost:8000/books
body選擇form
把title跟author輸入上去
送出就可以看成功的畫面喽!!
與post一樣我們這邊直接到update方法
public function update(Request $request, $id)
{
//
$book = Book::find($id);
$book->title = $request->title;
$book->save();
return response($book);
}
我們透過先找到該書籍的ID
再來把前端傳過來的title改過最後儲存進資料庫!!
這邊的postman要記得
把路徑是localhost:8000/books/2
books後面是id
public function destroy($id)
{
//
$book = Book::find($id);
$book->delete();
return response('刪除成功');
}
這邊不用帶入資料跟update一樣
只需要path後面帶ID即可
不過為了簡單呈現我把它使用index function
為了讓他route網頁首頁呈現
public function index()
{
//
return Book::all();
}
今天講的東西有點多
希望大家可以吸收
另外
如果對這份sample code有興趣
可以從我的github下載使用喔!!
ithome laravel sample code