iT邦幫忙

2021 iThome 鐵人賽

DAY 8
1
永豐金融APIs

釋放你的潛能用技能交易吧!系列 第 8

[Day08] 第八章-Laravel的CRUD操作及一些簡單指令

  • 分享至 

  • xImage
  •  

前言

今天會介紹laravel一些簡單的指令
以及建立路由還有CRUD方法
跟資料庫連線喔!!

目標

  1. php artisan 基本指令
  2. 資料庫工具以及連線設定
  3. controller意義
  4. route解釋w
  5. model解說
  6. migration操作說明
  7. 完整操作完book的CRUD
  8. laravel convention

實作&說明

前置作業 (建立好資料庫)

在開始實作之前我們先把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並且順便建立migration

首先我會先建立model並且建立資料表!!

這時候可以先下

php artisan make:book --migration

PS 這邊給大家一個觀念model習慣單數!!


或是可以使用-mc 建立migration +controller
但這邊我建議只要附加migraion就好C可以拿掉

因為建立controller時有更好的方式 !!!
就是加resource參數(會一次幫你把CRUD都建好)

第二步驟 編輯migration檔案

接者因為我們建立好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
非常重要不然會出錯喔!!
/images/emoticon/emoticon02.gif

第四步驟 接者我們要撰寫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會失敗喔!!

接者就進入主軸拉
/images/emoticon/emoticon01.gif
我們打開app/http/controllers/bookcontroller.php
先在use Illuminate\Http\Request;
新增

use App\Models\Book;

因為我們需要使用這個model的靜態方法

接者我們可以看到因為加上resouece參數建立好的一大堆function

首先

create 即是對應store 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輸入上去
送出就可以看成功的畫面喽!!

Update 對應laravel update

與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

delete 即是laravel 的delete方法

    public function destroy($id)
    {
        //
        $book = Book::find($id);
        $book->delete();

        return response('刪除成功');
    }

這邊不用帶入資料跟update一樣
只需要path後面帶ID即可

Read 這邊是對應show

不過為了簡單呈現我把它使用index function
為了讓他route網頁首頁呈現

    public function index()
    {
        //
        return Book::all();
    }

總結

今天講的東西有點多
希望大家可以吸收
另外
如果對這份sample code有興趣
可以從我的github下載使用喔!!
ithome laravel sample code


上一篇
[Day07] 第七章-簡單介紹Laravel的操作及MVC架構
下一篇
[Day09] 第九章-Laravel 操作心得及資料來源補充
系列文
釋放你的潛能用技能交易吧!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言