2025年11月30日 星期日

Laravel 12 表單驗證教學


1.Laravel 12 表單驗證教學|用正確方式驗證使用者輸入
在\resources\views\students\add.blade.php 去除 required
@extends('layouts.app')
@section('head')
    <title>Add Students</title>
@endsection

@section('content')
    <section>
        <div class="card shadow-lg">
            <div class="card-header bg-primary text-white">
                <h5 class="mb-0">Student Registration</h5>
            </div>
            <div class="card-body">
                <form action="{{ URL('student/create') }}" method="POST">
                    @csrf
                    <div class="mb-3">
                        <label for="name" class="form-label">Name</label>
                        <input type="text" class="form-control" id="name" name="name">
                    </div>
                    <div class="mb-3">
                        <label for="email" class="form-label">Email</label>
                        <input type="email" class="form-control" id="email" name="email">
                    </div>
                    <div class="mb-3">
                        <label for="age" class="form-label">Age</label>
                        <input type="number" class="form-control" id="age" name="age">
                    </div>
                    <div class="mb-3">
                        <label for="age" class="form-label">Date of Birth</label>
                        <input type="date" class="form-control" id="date_of_birth" name="date_of_birth">
                    </div>
                    <div class="mb-3">
                        <label class="form-label">Gender</label>
                        <div>
                            <div class="form-check form-check-inline">
                                <input class="form-check-input" type="radio" name="gender" id="male" value="m" >
                                <label class="form-check-label" for="male">Male</label>
                            </div>
                            <div class="form-check form-check-inline">
                                <input class="form-check-input" type="radio" name="gender" id="female" value="f">
                                <label class="form-check-label" for="female">Female</label>
                            </div>
                        </div>
                    </div>
                    <button type="submit" class="btn btn-success">送出</button>
                </form>
            </div>
        </div>
    </section>
@endsection

在http://127.0.0.1:8000/student/add,什麼資料都不填,直接按下[送出]
就會看到
我們需要在後端作驗證:
在\app\Http\Controllers\StudentController.php 編輯
        $request->validate([
            'name'  => 'required|string|max:255',
            'email' => 'required|email|unique:students,email',
            'age'   => 'required|integer|min:1|max:100',
            'date_of_birth' => 'required|date',
            'gender' => 'required|in:m,f',    
        ]);
如下圖:








2.Laravel 12 的 Form Request 驗證|乾淨且組織化的驗證方式









資料來源:
1.Laravel 12 Form Validation Tutorial | Validate User Input the Right Way
2.Laravel 12 Form Request Validation | Clean & Organized Validation in Laravel

2025年11月20日 星期四

Laravel 12:Eloquent 必學技巧一次掌握(Scopes、Soft Deletes、CRUD)


涵蓋主題如下:
一、Query Scopes:打造更乾淨且可重複使用的查詢邏輯
二、Soft Deletes:進行軟刪除並可還原資料
三、CRUD(Read):用 Eloquent 讀取資料
四、Table Filters:動態搜尋與條件篩選
五、Pagination:最佳化資料瀏覽與分頁
六、CRUD(Create):建立資料
七、CRUD(Update):更新資料
八、CRUD(Delete):刪除資料

一、Query Scopes:打造更乾淨且可重複使用的查詢邏輯
        觀念:Query Scope(查詢作用域) 是 Laravel Eloquent 提供的一種功能,用來把常用的查詢條件封裝起來,讓你的查詢程式碼更乾淨、可重複使用、可讀性更高。簡單說:把常用的 where、orderBy… 等查詢邏輯集中管理,並用簡短語法呼叫。

1.建立Query Scope(查詢作用域)---一個參數
在models\Student.php
輸入如下:
  public function scopeMale($query) {
    return $query->where('gender','m');
  }
如下圖:
在Http\Controller\StudentController.php
輸入如下:
    public function queryScope() {
        $item = Student::male()->get();
        return $item;
    }
    public function secondQuery() {
        $item = Student::male()->get();
        return $item;
    }
如下圖:
在\routes\web.php 加入
Route::get('query-scope',[StudentController::class,'queryScope']);
Route::get('second-query',[StudentController::class,'secondQuery']);
如下圖
接下來,下指令 php artisan serve
在網址輸入:  http://127.0.0.1:8000/query-scope
                          http://127.0.0.1:8000/second-query
就會出現 
接下來,修改Query Scope(查詢作用域)
在models\Student.php
輸入如下:
  public function scopeMale($query) {
    return $query->where('gender','m')->where('age','18');
  }
如下圖:
接下來,其餘不變。下指令 php artisan serve
在網址輸入:  http://127.0.0.1:8000/query-scope
                          http://127.0.0.1:8000/second-query
就會出現

2.建立Query Scope(查詢作用域)---一個參數
在models\Student.php
輸入如下:
  public function scopeFemale($query) {
    return $query->where('gender','f')->where('age','18');
  }
如下圖:
在Http\Controller\StudentController.php
輸入如下:
    public function thirdScope() {
        $item = Student::female()->get();
        return $item;
    }
    public function fourQuery() {
        $item = Student::female()->get();
        return $item;
    }
如下圖:
在\routes\web.php 加入
Route::get('third-scope',[StudentController::class,'thirdScope']);
Route::get('four-query',[StudentController::class,'fourQuery']);
如下圖
接下來,下指令 php artisan serve
在網址輸入:  http://127.0.0.1:8000/third-scope
                          http://127.0.0.1:8000/four-query
就會出現 

3.建立Query Scope(查詢作用域)---二個參數
在models\Student.php
輸入如下:
  public function scopeMale($query,$age=18) {
    return $query->where('gender','m')->where('age',$age);
  }
  public function scopeFemale($query,$age=18) {
    return $query->where('gender','f')->where('age',$age);
  }
如下圖:
在Http\Controller\StudentController.php
輸入如下:
    public function queryScope() {
        $item = Student::male(25)->get();
        return $item;
    }
    public function thirdScope() {
        $item = Student::female(25)->get();
        return $item;
    }
如下圖:
在\routes\web.php 加入
Route::get('query-scope',[StudentController::class,'queryScope']);
Route::get('third-scope',[StudentController::class,'thirdScope']);
如下圖
接下來,下指令 php artisan serve
在網址輸入:  http://127.0.0.1:8000/query-scope
                          http://127.0.0.1:8000/third-query
就會出現 


二、Soft Deletes:進行軟刪除並可還原資料
      觀念:Laravel 12(以及早期版本)中,Soft Deletes(軟刪除)是 Eloquent ORM 提供的一種資料刪除方式,讓你的「刪除」操作不會真的把資料從資料庫移除,而是將資料標記為已刪除,以便未來可恢復、查詢紀錄或避免資料遺失。

在學生表建立一個新列,然後清除所有資料。
指令:php artisan make:migration addSoftDeleteToStudentsTable
接下來,在database\migrations\2025_11_21_190645_add_soft_delete_to_students_table.php 
加上這句
            $table->softDeletes();
如下圖:
然後輸入指令:php artisan migrate
進入網址:http://127.0.0.1:8080/phpmyadmin/index.php
可看到
在 app\Models\Student.php 加入
    use SoftDeletes;
如下圖:
刪除第2筆資料
在app\Controllers\StudentController.php 加入
        Student::findOrFail(2)->delete();
如下圖:
在原先的routes\web.php 可看到
Route::get('delete-data',[StudentController::class,'deleteData']);
如下圖:
進入網址:http://127.0.0.1:8000/delete-data
進入網址:http://127.0.0.1:8080/phpmyadmin/index.php
可看到

01.只看[未被註記為刪除的資料],
在app\Controllers\StudentController.php 修改
        $item = Student::all();
如下圖:
在原先的routes\web.php 可看到
Route::get('get-data',[StudentController::class,'getData']);
如下圖:
進入網址:http://127.0.0.1:8000/get-data

02.若要只看到[被註記為刪除的資料],
在app\Controllers\StudentController.php 修改
        $item = Student::onlyTrashed()->get();
如下圖:
其他部分照舊,進入網址:http://127.0.0.1:8000/get-data

03.若要看到[被註記為刪除的資料]+[未被註記為刪除的資料],
在app\Controllers\StudentController.php 修改
        $item = Student::withTrashed()->get();
如下圖:
其他部分照舊,進入網址:http://127.0.0.1:8000/get-data
04.若要將[被註記為刪除的資料]恢復,
在app\Controllers\StudentController.php 修改
        $item = Student::withTrashed()->find(2)->restore();
如下圖:
其他部分照舊,進入網址:http://127.0.0.1:8000/get-data
進入網址:http://127.0.0.1:8080/phpmyadmin/index.php
可看到

05.強制刪除
在app\Controllers\StudentController.php 修改
        Student::find(2)->forceDelete();
如下圖:
其他部分照舊,進入網址:http://127.0.0.1:8000/delete-data
進入網址:http://127.0.0.1:8080/phpmyadmin/index.php
可看到

三、CRUD(Read):用 Eloquent 讀取資料
CRUD 是資料操作的四大基本行為:
縮寫 全名 意義
C         Create 建立
R         Read 讀取
U         Update 更新
D         Delete 刪除
Read(讀取) 指的是從資料庫把你需要的資料查詢出來。
在 Laravel 中,你通常會使用 Eloquent ORM 來讀取資料。
Read(讀取)是 CRUD 中負責 查詢資料 的部份。
使用 Laravel 的 Eloquent ORM,你可以用非常簡潔的語法查詢資料庫,例如:
all():取全部
find():依 id 找
where():條件查詢
first():取第一筆
with():連同關聯讀出
paginate():分頁

新增 \resources\views\students\index.blade.php,其內容如下:
@extends('layouts.app')
@section('head')
    <title>Students</title>
@endsection

@section('styles')
    <style>
        table {
            width: 100%;
            border-collapse: collapse;
        }

        table,
        th,
        td {
            border: 1px solid black;
        }

        th,
        td {
            padding: 10px;
            text-align: left;
        }

        th {
            background-color: #005bb5;
            color: white;
        }

        tr:nth-child(even) {
            background-color: #f2f2f2;
        }

        tr:hover {
            background-color: #f5f5f5;
        }

        h2 {
            color: #005bb5;
            text-align: center;
        }

        .search {
            display: flex;
            justify-content: center;
            margin-bottom: 20px;
        }

        .search input {
            padding: 10px;
            width: 50%;
            margin-right: 10px;
        }

        .search button {
            padding: 10px;
            background-color: #005bb5;
            color: white;
            border: none;
        }

        .search button:hover {
            background-color: #004080;
        }

        .editButton {
            background-color: #4CAF50;
            color: white;
            padding: 5px 10px;
            text-align: center;
            text-decoration: none;
            display: inline-block;
            border-radius: 5px;
        }

        .editButton:hover {
            background-color: #45a049;
        }

        .deleteButton {
            background-color: #f44336;
            color: white;
            padding: 5px 10px;
            text-align: center;
            text-decoration: none;
            display: inline-block;
            border-radius: 5px;
        }

        .deleteButton:hover {
            background-color: #da190b;
        }

        .paginationDiv {
            text-align: center;
            margin-top: 20px;
        }

        .addStudentButton {
            background-color: #005bb5;
            color: white;
            padding: 10px;
            text-align: center;
            text-decoration: none;
            display: inline-block;
            border-radius: 5px;
            margin-left: 10px;
        }

        .addStudentButton:hover {
            background-color: #004080;
        }
    </style>
@endsection


@section('content')
    <section>
        <h2>Students</h2>
            <div class="search">
                <input type="text" placeholder="Search"">
                <button>Search</button>
            </div>
        </form>

        <table>
            <thead>
                <tr>
                    <th>ID</th>
                    <th>Name</th>
                    <th>Email</th>
                    <th>Age</th>
                    <th>Date of Birth</th>
                    <th>Gender</th>
                    <th>Score</th>
                    <th>Actions</th>
                </tr>
            </thead>
        </table>
    </section>
@endsection


新增 \resources\views\layouts\app.blade.php,其內容如下:

<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Basic HTML5 Template</title>
        <link rel="stylesheet" href="styles.css">
        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
            integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
        @yield('head')
        <style>
            body {
                font-family: Arial, sans-serif;
                margin: 0;
                padding: 0;
                display: flex;
                flex-direction: column;
                min-height: 100vh;
            }

            nav ul {
                list-style-type: none;
                padding: 0;
                background: #005bb5;
                overflow: hidden;
                display: flex;
                justify-content: center;
            }

            nav ul li {
                padding: 14px 20px;
            }

            nav ul li a {
                color: white;
                text-decoration: none;
            }

            .container {
                display: flex;
                flex: 1;
                max-width: 100%;
            }

            .sidebar {
                width: 250px;
                background: #f4f4f4;
                padding: 15px;
            }

            .main-content {
                flex: 1;
                padding: 20px;
            }

            footer {
                background: #004080;
                color: white;
                text-align: center;
                padding: 10px;
                position: relative;
                bottom: 0;
                width: 100%;
            }
        </style>
        @yield('styles')

    </head>

    <body>
        <nav>
            <ul>
                <li><a href="#">Home</a></li>
                <li><a href="#">About</a></li>
                <li><a href="#">Services</a></li>
                <li><a href="#">Contact</a></li>
            </ul>
        </nav>

        <div class="container">
            <aside class="sidebar">
                <h2>Sidebar</h2>
                <ul>
                <li><a href="#">Link01</a></li>
                <li><a href="#">Link02</a></li>
                <li><a href="#">Link03</a></li>
                <li><a href="#">Link04</a></li>
                </ul>

                <div class="userDetails">
                </div>


            </aside>
            <main class="main-content">
                @yield('content')

            </main>
        </div>

        <footer>
            <p>&copy; 2025 My Website. All rights reserved.</p>
        </footer>
    </body>

    <script>
    </script>
    @yield('scripts')

</html>


那我們在\routes\web.php 加入
Route::prefix('student')->controller(StudentController::class)->group(function(){
    Route::get('/','index');
});
如下圖:

那我們在\app\Controllers\StudentController.php 加入
    public function index() {
        return view('students.index');
    }
如下圖:
在http://127.0.0.1:8000/student,可以看到
接下來,那我們在\app\Controllers\StudentController.php 加入
    public function index() {
        $students = Student::all();
        return view('students.index',compact('students'));
    }
如下圖:

編輯 \resources\views\students\index.blade.php,其內容如下:

            <tbody>
                @foreach ($students as $student)
                <tr>
                    <td> {{ $student->id }}</td>
                    <td> {{ $student->name }}</td>
                    <td> {{ $student->email }}</td>
                    <td> {{ $student->age }}</td>
                    <td> {{ $student->date_of_birth }}</td>
                    <td> {{ $student->gender }}</td>
                </tr>
                @endforeach
            </tbody>
如下圖:
在http://127.0.0.1:8000/student,可以看到
編輯 \resources\views\students\index.blade.php,其內容如下:
                <td>
                  <a href="#" class="editButton">Edit</a>
                  <a href="#" class="deleteButton">Delete</a>
                </td>
如下圖:
在http://127.0.0.1:8000/student,可以看到

四、Table Filters:動態搜尋與條件篩選
目標:讓 search 有功用
編輯 \resources\views\students\index.blade.php,其內容如下:
      <form action="{{ URL('student') }}" method="GET">
         <div class="search">
           <input type="text" placeholder="Search" id="search" name="search">
           <button type="submit">Search</button>
         </div>
      </form>

如下圖:
在\app\Controllers\StudentController.php 加入
public function index(Request $request) {
        $students = Student::when($request->search, function ($query) use ($request) {
            return $query->whereAny([
                'name',
                'age',
                'email',
                'date_of_birth',
                'gender'
            ],$request->search);
        })->get();
        return View('students.index',compact('students'));
    }
   
如下圖:
在http://127.0.0.1:8000/student,可以看到
在 Search 欄位內加入 Donavon Donnelly ,按下 Search 按鈕。可得下圖:
如果要相似搜尋,則可以在\app\Controllers\StudentController.php 編輯如下:
    public function index(Request $request) {
        $students = Student::when($request->search, function ($query) use ($request) {
            return $query->whereAny([
                'name',
                'age',
                'email',
                'date_of_birth',
                'gender'
            ],'like','%'.$request->search.'%');
        })->get();
        return View('students.index',compact('students'));
    }
如下圖:
在http://127.0.0.1:8000/student,搜尋列可以輸入hill。如下圖:

五、Pagination:最佳化資料瀏覽與分頁
目前資料庫大約有100多筆資料,若有1000筆~2000筆則頁面載入的速度則會變慢。現在資料庫新增10000筆資料。
在database\seeders\DatabaseSeeder.php 編輯
        Student::factory(10000)->create();
如下圖:
接下來,下指令 php artisan db:seed
在http://127.0.0.1:8080/phpmyadmin,可看見
10000多筆資料呈現會更慢。為了避免這種情況發生,我們需要在表格形成分頁。
在\app\Http\Controllers\StudentController.php 編輯
    public function index(Request $request) {
        $students = Student::when($request->search, function ($query) use ($request) {
            return $query->whereAny([
                'name',
                'age',
                'email',
                'date_of_birth',
                'gender'
            ],'like','%'.$request->search.'%');
        })->paginate(10);
        return View('students.index',compact('students'));
    }
在\resources\views\students\index.blade.php 編輯
        <div class="paginationDiv">
            {{ $students->links() }}
        </div>
如下圖:
在http://127.0.0.1:8000/student,可看見
在\resources\views\students\index.blade.php 編輯

        <div class="paginationDiv">
            {{ $students->links('pagination::bootstrap-5') }}
        </div>

如下圖:
在http://127.0.0.1:8000/student,可看見
接下來,我們需要在專案內添加bootstrap-5。
在\resources\views\layouts\app.blade.php 編輯
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
 integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">

如下圖:
但問題來了。若進
行篩選,則會篩選在分頁後不見。
在\resources\views\students\index.blade.php 編輯兩處
        <form action="{{ URL('student') }}" method="GET">
            <div class="search">
                <input type="text" placeholder="Search" id="search" name="search" value="{{ request('search') }}">
                <button type="submit">Search</button>
            </div>
        </form>

如下圖:

<div class="paginationDiv">
 {{ $students->appends(request()->query())->links('pagination::bootstrap-5') }}
</div>

如下圖:

六、CRUD(Create):建立資料
建立一個新增學生的表單。
在\resources\views\students\add.blade.php 編輯

@extends('layouts.app')
@section('head')
    <title>Add Students</title>
@endsection

@section('content')
    <section>
        <div class="card shadow-lg">
            <div class="card-header bg-primary text-white">
                <h5 class="mb-0">Student Registration</h5>
            </div>
            <div class="card-body">
                <form action="" method="POST">
                    <div class="mb-3">
                        <label for="name" class="form-label">Name</label>
                        <input type="text" class="form-control" id="name" name="name" required>
                    </div>
                    <div class="mb-3">
                        <label for="email" class="form-label">Email</label>
                        <input type="email" class="form-control" id="email" name="email" required>
                    </div>
                    <div class="mb-3">
                        <label for="age" class="form-label">Age</label>
                        <input type="number" class="form-control" id="age" name="age" required>
                    </div>
                    <div class="mb-3">
                        <label for="age" class="form-label">Date of Birth</label>
                        <input type="date" class="form-control" id="date_of_birth" name="date_of_birth" required>
                    </div>
                    <div class="mb-3">
                        <label class="form-label">Gender</label>
                        <div>
                            <div class="form-check form-check-inline">
                                <input class="form-check-input" type="radio" name="gender" id="male" value="m"  required>
                                <label class="form-check-label" for="male">Male</label>
                            </div>
                            <div class="form-check form-check-inline">
                                <input class="form-check-input" type="radio" name="gender" id="female" value="f" required>
                                <label class="form-check-label" for="female">Female</label>
                            </div>
                        </div>
                    </div>
                    <button type="submit" class="btn btn-success">Submit</button>
                </form>
            </div>
        </div>
    </section>
@endsection


在\resources\views\students\index.blade.php 編輯

<a class="addStudentButton" href="{{ URL('student/add') }}">Add Student</a>

如下圖:
在\routes\web.php 編輯

Route::prefix('student')->controller(StudentController::class)->group(function(){
    Route::get('/','index');
    Route::view('add','students.add');
});

如下圖:
在http://127.0.0.1:8000/student,可看見
在http://127.0.0.1:8000/student/add,可看見
在\routes\web.php 編輯

Route::prefix('student')->controller(StudentController::class)->group(function(){
    Route::get('/','index');
    Route::view('add','students.add');
    Route::post('create','create');
});

如下圖:
在\app\Http\Controllers\StudentController.php 編輯
    public function create(Request $request) {
        $student = new Student();
        $student->name = $request->name;
        $student->email = $request->email;
        $student->age = $request->age;
        $student->date_of_birth = $request->date_of_birth;
        $student->gender = $request->gender;
        $student->save();

        return redirect('student');
    }
如下圖:
在 http://127.0.0.1:8000/student/add 填寫資料,按下Submit
就會得到
此時,在\resources\views\students\add.blade.php 編輯 
                    @csrf
如下圖:
http://127.0.0.1:8000/student/add 填寫資料,按下Submit
就會回到

七、CRUD(Update):更新資料
建立一個更新學生的表單。
在\resources\views\students\edit.blade.php 編輯
@extends('layouts.app')
@section('head')
    <title>Edit Students</title>
@endsection

@section('content')
    <section>
        <div class="card shadow-lg">
            <div class="card-header bg-warning text-white">
                <h5 class="mb-0">Edit Student</h5>
            </div>
            <div class="card-body">
                <form action="" method="POST">
                    @csrf
                    <div class="mb-3">
                        <label for="name" class="form-label">Name</label>
                        <input type="text" class="form-control" id="name" name="name" required>
                    </div>
                    <div class="mb-3">
                        <label for="email" class="form-label">Email</label>
                        <input type="email" class="form-control" id="email" name="email" required>
                    </div>

                    <div class="mb-3">
                        <label for="age" class="form-label">Age</label>
                        <input type="age" class="form-control" id="age" name="age" required>
                    </div>

                    <div class="mb-3">
                        <label for="date_of_birth" class="form-label">Date of Birth</label>
                        <input type="date" class="form-control" id="date_of_birth" name="date_of_birth" required>
                    </div>
                    <div class="mb-3">
                        <label class="form-label">Gender</label>
                        <div>
                            <div class="form-check form-check-inline">
                                <input class="form-check-input" type="radio" name="gender" id="male" value="m">
                                     <label class="form-check-label" for="male">Male</label>
                            </div>
                            <div class="form-check form-check-inline">
                                <input class="form-check-input" type="radio" name="gender" id="female" value="f">
                                <label class="form-check-label" for="female">Female</label>
                            </div>
                        </div>
                    </div>
                    <button type="submit" class="btn btn-primary">Update</button>
                </form>
            </div>
        </div>
    </section>
@endsection

在\routes\web.php 編輯

    Route::get('edit/{id}','edit');

如下圖:
在\app\Http\Controllers\StudentController.php 編輯

    public function edit($id) {
        $student = Student::findOrFail($id);

        return view('students.edit',compact('student'));
    }

如下圖:
編輯 \resources\views\students\index.blade.php,其內容如下:

<a href="{{ URL('student/edit',$student->id) }}" class="editButton">Edit</a>

如下圖:
在 http://127.0.0.1:8000/student ,按下edit
就會得到
在\resources\views\students\edit.blade.php 編輯

<input type="text" class="form-control" id="name" name="name" required value="{{ $student->name }}">
<input type="email" class="form-control" id="email" name="email" required value="{{ $student->email }}">
<input type="age" class="form-control" id="age" name="age" required value="{{ $student->age }}">
<input type="date" class="form-control" id="date_of_birth" name="date_of_birth" required value={{ $student->date_of_birth }}>
<input class="form-check-input" type="radio" name="gender" id="male" value="m"
                                {{ $student->gender == 'm' ? 'checked' : '' }}>
<input class="form-check-input" type="radio" name="gender" id="female" value="f"
                                {{ $student->gender == 'f' ? 'checked' : '' }}>

如下圖:
http://127.0.0.1:8000/student/edit/4 填寫資料,要按下Update 之前
在\routes\web.php 編輯

    Route::post('update/{id}','update');

如下圖:
在\app\Http\Controllers\StudentController.php 編輯

    public function update(Request $request,$id) {
        $student = Student::findOrFail($id);
        $student->name = $request->name;
        $student->email = $request->email;
        $student->age = $request->age;
        $student->date_of_birth = $request->date_of_birth;
        $student->gender = $request->gender;
        $student->update();

        return redirect('student');
    }


如下圖:
在\resources\views\students\edit.blade.php 編輯
<form action="{{ URL('student/update',$student->id) }}" method="POST">
如下圖:
http://127.0.0.1:8000/student/edit/4 填寫資料,要按下Update
就會回到

八、CRUD(Delete):刪除資料
編輯 \resources\views\students\index.blade.php,其內容如下:

<form action="{{ URL('') }}" method="post" style="display:inline;"
onsubmit="return confirm('Are you sure you want to delete this student ?')">

@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger btn-sm">Delete</button>
</form>

如下圖:
在\routes\web.php 編輯

    Route::delete('delete/{id}','destory');

如下圖:
在\app\Http\Controllers\StudentController.php 編輯

    public function destory(Request $request,$id) {
        $student = Student::findOrFail($id)->delete();
               
        return redirect('student');
    }

如下圖:
編輯 \resources\views\students\index.blade.php,其內容如下:

<form action="{{ URL('student/delete',$student->id) }}" method="post" style="display:inline;"
   onsubmit="return confirm('Are you sure you want to delete this student ?')">

   @csrf
   @method('DELETE')
   <button type="submit" class="btn btn-danger btn-sm">Delete</button>
</form>

如下圖:
http://127.0.0.1:8000/student 選筆資料,要按下Delete
就會回到http://127.0.0.1:8000/student

資料來源:

Laravel 12 表單驗證教學

相關系列文章: 01. 在 windows 10 安裝 laravel 12 studentManagement環境與設定 02. laravel 12 route 路由 03. laravel 12 Blade Templates 網頁模版 04. laravel 12 Con...