part#6 จัดการหัวข้อ/ประเภท (Category) และเรียนรู้หลักการ CRUD

1. สร้างตาราง categories และฟิลด์ที่ต้องการลงในฐานข้อมูล ด้วยคำสั่ง ดังนี้
php artisan make:migration create_categories_table
- เพิ่มข้อมูลฟิลด์ต่างๆลงในไฟล์ create_categories_table ที่อยู่ในโฟลเดอร์ database/migrations
public function up(): void
{
Schema::create('categories', function (Blueprint $table) {
$table->id();
$table->string('cat_title');
$table->string('cat_subtitle');
$table->text('cat_description');
$table->tinyInteger('cat_status')->default(1);
$table->timestamps();
});
}
- ใช้คำสั่งบนคอมมานด์ไลน์ของ vs code ดังนี้
php artisan migrate
- จะได้ตารางชื่อ categories เพิ่มขึ้นมาในฐานข้อมูลและมีฟิลด์ต่างๆครบตามที่กำหนดไว้
2. สร้างโมเดลสำหรับจัดการกับตาราง categories ดังนี้
php artisan make:model Categories
- จากนั้นเปิดไฟล์โมเดล Categories ซึ่งอยู่ในโฟลเดอร์ app/Models แล้วเพิ่มข้อมูลฟิลด์ให้ครบ บันทึกให้เรียบร้อย
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Categories extends Model
{
protected $fillable = [
'cat_title',
'cat_subtitle',
'cat_description',
'cat_status',
];
}
3. สร้างเมนู All Categories โดยเพิ่มเร้าท์เพื่อทำลิ้งค์เมนูด้านซ้าย ให้เปิดไฟล์ view/layouts/sidebar.blade.php เพิ่มโค้ดใต้เมนู Users และเพิ่มเร้าท์ ตามตัวหนังสือสีแดง เพื่อสร้างเมนู All Category ดังนี้
<!-- Categories -->
<li class="sidebar-item">
<a class="sidebar-link justify-content-between has-arrow" href="javascript:void(0)" aria-expanded="false">
<div class="d-flex align-items-center gap-3">
<span class="d-flex">
<i class="ti ti-layout-grid"></i>
</span>
<span class="hide-menu">Categories</span>
</div>
</a>
<ul aria-expanded="false" class="collapse first-level">
<li class="sidebar-item">
<a class="sidebar-link justify-content-between"
href="{{ route('admin.category.show_category') }}" aria-expanded="false">
<div class="d-flex align-items-center gap-3">
<div class="round-16 d-flex align-items-center justify-content-center">
<i class="ti ti-circle"></i>
</div>
<span class="hide-menu">All Categories</span>
</div>
</a>
</li>
<li class="sidebar-item">
<a class="sidebar-link justify-content-between"
href="#">
<div class="d-flex align-items-center gap-3">
<div class="round-16 d-flex align-items-center justify-content-center">
<i class="ti ti-circle"></i>
</div>
<span class="hide-menu">New Category</span>
</div>
</a>
</li>
</ul>
</li>
<!--End Categories -->
4. เปิดไฟล์ web.php เพิ่มเร้าท์คอนโทรลเลอร์ ให้สอดคล้องกับข้อที่ 3 ดังนี้
//ส่วน Admin
Route::name("admin.")->prefix("/admin")->middleware(["auth"])->group(function() {
Route::get('/show_users', [UserController::class, 'index'])->name('user.showusers');
Route::get('/create_users', [UserController::class, 'create'])->name('user.create');
Route::post('/add_users', [UserController::class, 'store'])->name('user.store');
Route::get('/show_users/{id}', [UserController::class, 'show'])->name('user.show');
Route::get('/edit_users/{id}', [UserController::class, 'edit'])->name('user.edit');
Route::patch('/update_users/{id}', [UserController::class, 'update'])->name('user.update');
Route::delete('/delete_users/{id}', [UserController::class, 'destroy'])->name('user.delete');
//ส่วน Category
Route::get('/show_categories', [CategoryController::class, 'index'])->name('category.show_category');
});
5. สร้างคอนโทรลเลอร์ชื่อ CategoryController
php artisan make:controller CategoryController -r
6. เปิดไฟล์ CategoryController เพิ่มโค้ดลงในฟังก์ชั่น index ดังนี้
public function index()
{
$cats = Categories::all();
return view('admin.categories.index', compact('cats'));
}
7. ในไฟล์ CategoryController เพิ่ม use โมเดลที่ส่วนหัวของไฟล์
<?php
namespace App\Http\Controllers;
use App\Models\Categories;
use Illuminate\Http\Request;
8. สร้างโฟลเดอร์ชื่อ categories ไว้ใน view/admin/ และจากนั้นให้สร้างไฟล์ index.blade.php ไว้ในโฟลเดอร์ view/admin/categories จากนั้นเพิ่มโค้ดสำหรับแสดงผลลงในไฟล์ ดังนี้
@extends('layouts.app')
@section('items')
<div class="card-header d-flex justify-content-between align-items-center">
<h3 class="m-0">Categories</h3>
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="/dashboard">Dashboard</a></li>
<li class="breadcrumb-item active">All Categories</li>
</ol>
</div>
@endsection
@section('content')
<div class="card">
@if (session("success"))
<div class="alert alert-success alert-dismissible">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
<h5><i class="icon fas fa-check"></i> Success!</h5>
<p class="m-0">{{ session("success") }}</p>
</div>
@endif
@if (session('status'))
<div class="alert alert-success">
{{ session('status') }}
</div>
@endif
<!--Start main -->
<div class="card-body">
<div class="d-md-flex align-items-center">
<div>
<h4 class="card-title">รายชื่อCategory</h4>
<p class="card-subtitle">
ทั่วไป/วิชาการ/ท่องเที่ยวฯ
</p>
</div>
<div class="ms-auto mt-3 mt-md-0">
<a href="#" class="btn btn-outline-info">+ NewCategory</a>
</div>
</div>
<!-- Start section table -->
<div class="table-responsive mt-4">
<table class="table mb-0 text-nowrap varient-table align-middle fs-3">
<thead>
<tr>
<th scope="col" class="px-0 text-muted">
#
</th>
<th scope="col" class="px-0 text-muted">
Category_Title
</th>
<th scope="col" class="px-0 text-muted">Category_SubTitle</th>
<th scope="col" class="px-0 text-muted">Category_Status</th>
<th scope="col" class="px-0 text-muted">Action</th>
</tr>
</thead>
<tbody>
@foreach ($cats as $cat )
<tr>
<td class="px-0">{{ $loop->iteration }}</td>
<td class="px-0">{{ $cat->cat_title }}</td>
<td class="px-0">{{ $cat->cat_subtitle }}</td>
<td class="px-0">
@if($cat->cat_status==1)
<span class="text-secondary">Active</span>
@else
<span class="text-danger">Disabled</span>
@endif
</td>
<td class="px-0">
<div class="d-flex align-items-center">
<a href="#" class="btn btn-success btn-sm">View</a>
<a href="#" class="btn btn-warning btn-sm">Edit</a>
<form action="#" method="post">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger btn-sm">Delete</button>
</form>
</div>
</td>
</tr>
</tbody>
@endforeach
</table>
</div>
</div>
</div>
@endsection
9. เพิ่มคำสั่ง use (บรรทัดสีแดง)ไว้ในส่วนบนของไฟล์ web.php
use App\Http\Controllers\UserController;
use App\Http\Controllers\CategoryController;
use App\Http\Controllers\ProfileController;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\AdminController;
- ทดสอบการทำงาน โดยคลิ๊กที่เมนู Categories->All Categories ต้องใช้งานได้
10. ต่อไปสร้างเมนูเพิ่มหัวข้อ(Create New Category) เริ่มโดยการเพิ่มเร้าท์เพื่อทำลิ้งค์เมนูด้านซ้าย เปิดไฟล์ view/layouts/sidebar.blade.php เพิ่มโค้ดใต้เมนู Categories และเพิ่มเร้าท์ ตามตัวหนังสือสีแดง เพื่อสร้างเมนู New Category ดังนี้
<!-- Categories -->
<li class="sidebar-item">
<a class="sidebar-link justify-content-between has-arrow" href="javascript:void(0)" aria-expanded="false">
<div class="d-flex align-items-center gap-3">
<span class="d-flex">
<i class="ti ti-layout-grid"></i>
</span>
<span class="hide-menu">Categories</span>
</div>
</a>
<ul aria-expanded="false" class="collapse first-level">
<li class="sidebar-item">
<a class="sidebar-link justify-content-between"
href="{{ route('admin.category.show_category') }}" aria-expanded="false">
<div class="d-flex align-items-center gap-3">
<div class="round-16 d-flex align-items-center justify-content-center">
<i class="ti ti-circle"></i>
</div>
<span class="hide-menu">All Categoriess</span>
</div>
</a>
</li>
<li class="sidebar-item">
<a class="sidebar-link justify-content-between"
href="{{route('admin.category.create')}}">
<div class="d-flex align-items-center gap-3">
<div class="round-16 d-flex align-items-center justify-content-center">
<i class="ti ti-circle"></i>
</div>
<span class="hide-menu">New Category</span>
</div>
</a>
</li>
</ul>
</li>
<!--End Categories -->
- ใส่เร้าท์แบบเดียวกันลงในปุ่ม +NewCategory ที่อยู่ตรงด้านขวา บน ของตารางด้วย
11. เพิ่มเร้าท์ลงใน web.php
Route::get('/show_categories', [CategoryController::class, 'index'])->name('category.show_category');
Route::get('/create_categories', [CategoryController::class, 'create'])->name('category.create');
12. เปิดไฟล์ CategoryController เพิ่มโค้ดลงในฟังก์ชั่น create ดังนี้
public function create()
{
return view('admin.categories.create');
}
13. สร้างไฟล์ create.blade.php ไว้ใน view/admin/categories
14. สร้างฟอร์มสำหรับกรอกข้อมูล New Category โดยเพิ่มโค้ดลงในไฟล์ create.blade.php ดังนี้
@extends('layouts.app')
@section('items')
<div class="card-header d-flex justify-content-between align-items-center">
<h3 class="m-0">New Catagory</h3>
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="/dashboard">Dashboard</a></li>
<li class="breadcrumb-item active">New Category</li>
</ol>
</div>
@endsection
@section('content')
<div class="card">
<div class="col-md-6 mx-4 mb-3">
<form action="{{ route('admin.category.store')}}" method="POST">
<div class="form-group mb-3 mt-3">
<label for="cat_title" class="form-label">Category_Title</label>
<input type="text" class="form-control" id="category_title" name="cat_title" placeholder="Enter Category Name">
</div>
<div class="mb-3">
<label for="cat_subtitle" class="form-label">Category_SubTitle</label>
<input type="text" class="form-control" id="cat_subtitle" name="cat_subtitle" placeholder="Enter Subtitle Category">
</div>
<div class="mb-3">
<label for="cat_description" class="form-label">Category_Description</label>
<textarea class="form-control" id="cat_description" name="cat_description" rows="4" placeholder="Enter Description"></textarea>
</div>
<div class="form-group mb-3">
<label for="cat_status" class="form-label">Category_Status</label>
<select class="form-control" id="status" name="cat_status" placeholder="Enter Status">
<option value="1">Active</option>
<option value="0">Disabled</option>
</select>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>
</div>
@endsection
15. เพิ่มเร้าท์ในไฟล์ web.php
//ส่วน Admin
Route::name("admin.")->prefix("/admin")->middleware(["auth"])->group(function() {
Route::get('/show_users', [UserController::class, 'index'])->name('user.showusers');
Route::get('/create_users', [UserController::class, 'create'])->name('user.create');
Route::post('/add_users', [UserController::class, 'store'])->name('user.store');
Route::get('/show_users/{id}', [UserController::class, 'show'])->name('user.show');
Route::get('/edit_users/{id}', [UserController::class, 'edit'])->name('user.edit');
Route::patch('/update_users/{id}', [UserController::class, 'update'])->name('user.update');
Route::delete('/delete_users/{id}', [UserController::class, 'destroy'])->name('user.delete');
//ส่วน Category
Route::get('/show_categories', [CategoryController::class, 'index'])->name('category.show_category');
Route::get('/create_categories', [CategoryController::class, 'create'])->name('category.create');
Route::post('/add_categories', [CategoryController::class, 'store'])->name('category.store');
16. เพิ่มคำสั่งลงในไฟล์ CategoryController ส่วนฟังก์ชั่น store ดังนี้
public function store(Request $request)
{
$validated = $request->validate([
'cat_title' => 'required|string|max:255',
'cat_subtitle' => 'required|string|max:255',
'cat_description' => 'required|string|max:255',
'cat_status' => 'required|in:0,1',
]);
$category = Categories::create($validated);
return to_route('admin.category.show_category')->with('status', 'New Category-created');
}
- ทดสอบเพิ่มข้อมูลลงในฟอร์ม และกด submit จะพบว่ามีข้อมูล category เพิ่มลงในตาราง categories เรียบร้อย
- จากนั้นเมื่อเพิ่มข้อมูลได้แล้วให้ return ไปที่หน้า index เพื่อแสดงข้อมูล category ที่มีทั้งหมด (เก่าและใหม่)
17. เพิ่มเร้าท์ที่ปุ่ม view ในไฟล์ index.blade.php เพื่อดูรายละเอียดข้อมูลทั้งหมด
<td class="px-0">
<div class="d-flex align-items-center">
<a href="{{ route('admin.category.show', $cat->id) }}" class="btn btn-success btn-sm">View</a>
<a href="#" class="btn btn-warning btn-sm">Edit</a>
<form action="#" method="post">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger btn-sm">Delete</button>
</form>
</div>
</td>
18. เพิ่มข้อมูลเร้าท์ในไฟล์ web.php
//ส่วน Category
Route::get('/show_categories', [CategoryController::class, 'index'])->name('category.show_category');
Route::get('/create_categories', [CategoryController::class, 'create'])->name('category.create');
Route::post('/add_categories', [CategoryController::class, 'store'])->name('category.store');
Route::get('/show_category/{id}', [CategoryController::class, 'show'])->name('category.show');
19. สร้างไฟล์ show.blade.php ลงในโฟลเดอร์ view/admin/categories และใส่โค้ดแสดงผลลงในไฟล์ ดังนี้
@extends('layouts.app')
@section('items')
<div class="card-header d-flex justify-content-between align-items-center">
<h3 class="m-0">Catagory_Details</h3>
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="/dashboard">Dashboard</a></li>
<li class="breadcrumb-item active">Category_Details</li>
</ol>
</div>
@endsection
@section('content')
<div class="card">
<div class="col-md-6 mx-4 mb-3">
<div class="mb-3 mt-3">
<label for="cat_title" class="form-label">Category_Title</label>
<input type="text" class="form-control" id="category_title" name="cat_title" value="{{ $cat->cat_title }}" readonly>
</div>
<div class="mb-3">
<label for="cat_subtitle" class="form-label">Category_SubTitle</label>
<input type="text" class="form-control" id="cat_subtitle" name="cat_subtitle" value="{{ $cat->cat_subtitle }}" readonly>
</div>
<div class="mb-3">
<label for="cat_description" class="form-label">Category_Description</label>
<textarea class="form-control" id="cat_description" name="cat_description" rows="4" readonly>{{ $cat->cat_description }}</textarea>
</div>
<div class="mb-3">
<label for="cat_status" class="form-label">Category_Status</label>
<p class="form-control-plaintext">
@if($cat->cat_status==1)
<span class="badge bg-success">Active</span>
@else
<span class="badge bg-danger">Disabled</span>
@endif
</p>
</div>
</div>
</div>
@endsection
20. เพิ่มคำสั่งลงในไฟล์ CategoryController ส่วนฟังก์ชั่น show ดังนี้
public function show(string $id)
{
$cat = Categories::find($id);
return view('admin.categories.show', compact('cat'));
}
21. ทดสอบคลิ๊กที่ปุ่ม view ได้แล้ว
22. เพิ่มเร้าท์ที่ปุ่ม edit ในไฟล์ index.blade.php เพื่อแก้ไขข้อมูล
<td class="px-0">
<div class="d-flex align-items-center">
<a href="{{ route('admin.category.show', $cat->id) }}" class="btn btn-success btn-sm">View</a>
<a href="{{ route('admin.category.edit', $cat->id) }}" class="btn btn-warning btn-sm">Edit</a>
<form action="#" method="post">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger btn-sm">Delete</button>
</form>
</div>
</td>
23. เพิ่มข้อมูลลงในเร้าท์ ไฟล์ web.php
//ส่วน Category
Route::get('/show_categories', [CategoryController::class, 'index'])->name('category.show_category');
Route::get('/create_categories', [CategoryController::class, 'create'])->name('category.create');
Route::post('/add_categories', [CategoryController::class, 'store'])->name('category.store');
Route::get('/show_category/{id}', [CategoryController::class, 'show'])->name('category.show');
Route::get('/edit_categoriess/{id}', [CategoryController::class, 'edit'])->name('category.edit');
24. เพิ่มคำสั่งลงในไฟล์ CategoryController ส่วนฟังก์ชั่น edit ดังนี้
public function edit(string $id)
{
$cat = Categories::find($id);
return view('admin.categories.edit', compact('cat'));
}
25. สร้างไฟล์ edit.blade.php ลงในโฟลเดอร์ view/admin/categories และใส่โค้ดลงในไฟล์ ดังนี้
@extends('layouts.app')
@section('items')
<div class="card-header d-flex justify-content-between align-items-center">
<h3 class="m-0">Edit Catagory</h3>
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="/dashboard">Dashboard</a></li>
<li class="breadcrumb-item active">Edit Category</li>
</ol>
</div>
@endsection
@section('content')
<div class="card">
<div class="col-md-6 mx-4 mb-3">
<form action="{{ route('admin.category.update', $cat->id)}}" method="POST">
@csrf
<div class="form-group mb-3 mt-3">
<label for="cat_title" class="form-label">Category_Title</label>
<input type="text" class="form-control" id="category_title" name="cat_title" value="{{ $cat->cat_title}}">
</div>
<div class="mb-3">
<label for="cat_subtitle" class="form-label">Category_SubTitle</label>
<input type="text" class="form-control" id="cat_subtitle" name="cat_subtitle" value="{{ $cat->cat_subtitle}}">
</div>
<div class="mb-3">
<label for="cat_description" class="form-label">Category_Description</label>
<textarea class="form-control" id="cat_description" name="cat_description" rows="4" >{{ $cat->cat_description}}</textarea>
</div>
<div class="form-group mb-3">
<label for="cat_status" class="form-label">Category_Status</label>
<select class="form-control" id="cat_status" name="cat_status">
<option value="1" {{ $cat->cat_status==1 ? 'selected' : '' }}>Active</option>
<option value="0" {{ $cat->cat_status==0 ? 'selected' : '' }}>Disabled</option>
</select>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>
</div>
@endsection
26. เพิ่มข้อมูลลงในเร้าท์ ไฟล์ web.php
//ส่วน Category
Route::get('/show_categories', [CategoryController::class, 'index'])->name('category.show_category');
Route::get('/create_categories', [CategoryController::class, 'create'])->name('category.create');
Route::post('/add_categories', [CategoryController::class, 'store'])->name('category.store');
Route::get('/show_category/{id}', [CategoryController::class, 'show'])->name('category.show');
Route::get('/edit_categoriess/{id}', [CategoryController::class, 'edit'])->name('category.edit');
Route::post('/update_categories/{id}', [CategoryController::class, 'update'])->name('category.update');
27. เพิ่มคำสั่งลงในไฟล์ CategoryController ส่วนฟังก์ชั่น update ดังนี้
public function update(Request $request, string $id)
{
$validated = $request->validate([
'cat_title' => 'required|string|max:255',
'cat_subtitle' => 'required|string|max:255',
'cat_description' => 'required|string|max:255',
'cat_status' => 'required|in:0,1',
]);
$category = Categories::find($id);
$category->update($validated);
return to_route('admin.category.show_category')->with('status', 'Category-updated');
}
- ทดสอบแก้ไขข้อมูล ซึ่งสามารถแก้ไขได้แล้ว
28. เพิ่มเร้าท์ที่ปุ่ม delete ในไฟล์ index.blade.php เพื่อลบข้อมูล
<td class="px-0">
<div class="d-flex align-items-center">
<a href="{{ route('admin.category.show', $cat->id) }}" class="btn btn-success btn-sm">View</a>
<a href="{{ route('admin.category.edit', $cat->id) }}" class="btn btn-warning btn-sm">Edit</a>
<form action="{{ route('admin.category.destroy', $cat->id) }}" method="post">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger btn-sm">Delete</button>
</form>
</div>
29. เพิ่มข้อมูลลงในเร้าท์ ไฟล์ web.php
//ส่วน Category
Route::get('/show_categories', [CategoryController::class, 'index'])->name('category.show_category');
Route::get('/create_categories', [CategoryController::class, 'create'])->name('category.create');
Route::post('/add_categories', [CategoryController::class, 'store'])->name('category.store');
Route::get('/show_category/{id}', [CategoryController::class, 'show'])->name('category.show');
Route::get('/edit_categoriess/{id}', [CategoryController::class, 'edit'])->name('category.edit');
Route::post('/update_categories/{id}', [CategoryController::class, 'update'])->name('category.update');
Route::delete('/delete_categories/{id}', [CategoryController::class, 'destroy'])->name('category.delete');
30. เพิ่มคำสั่งลงในไฟล์ CategoryController ส่วนฟังก์ชั่น destroy ดังนี้
public function destroy(string $id)
{
$category = Categories::find($id);
$category->delete();
return to_route('admin.category.show_category')->with('status', 'Category-Data Deleted');
}
- ทดสอบคลิ๊กที่ปุ่ม delete สามารถลบได้แล้ว
