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

前言

今天会介绍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


<<:  D22 中场休息: 要如何持续保持学习的热诚?

>>:  非专业常见面试问题

Day26 Gin with Logger

What is Log in backend Log顾名思义就是纪录,通常在Backend当中会将可...

远距 Scrum

前言 前两天分享了远距工作的好处与挑战,今天针对应用面来谈谈 Scrum 活动如何在远距工作的情况下...

Day 28 - XState in React (着重: local state)

前面介绍许多 State Machine 及 XState 的功能,由於篇幅不多了,今天想跟大家先快...

MITRE Engenuity ATT&CK Evaluations 测试报告

才刚提到趋势科技去年在 MITRE Engenuity 的 ATT&CK Evaluatio...

[D29] 检测框的精准度

现在来更加了解准确度这件事吧! 在前面有讲过 IoU ,它是用来跟标准框比较的准则,当它的值(0~1...