涵蓋主題如下:
一、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 修改
如下圖:
在原先的routes\web.php 可看到
Route::get('get-data',[StudentController::class,'getData']);
如下圖: 進入網址:http://127.0.0.1:8000/get-data在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-data04.若要將[被註記為刪除的資料]恢復,在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>© 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 編輯 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
資料來源: