Laravel 9 CRUD Application with MySQL — Complete Tutorial
Video Series — Complete
https://www.youtube.com/playlist?list=PLSWkjIP3b2ejXOP_j-0lCcHjznznL5iCZ
Laravel Version 9 ကိုအသုံးပြုပြီး CRUD Operation လေးလုပ်ကြမယ်။ ပထမဆုံး Laravel app ကို Download ဆွဲမယ်။ Laravel Project ရေးဖို့ ဘာလိုတယ် ဘာညာ အသေးစိတ်ပြောမနေပါဘူး၊ လောလောဆယ် XAMPP နဲ့ Composer ရှိရင် အဆင်ပြေပါတယ်။ PHP ကတော့ version 8 ကျော်ရပါမယ်။
Step 1. Download Laravel App
ကဲဒါဆိုရင် ကိုယ် Download လုပ် ချင်တဲ့ Folder မှာ cmd (or) terminal ကိုဖွင့်ပြီး အောက်ပါ command line နဲ့ laravel-crud ဆိုတဲ့ နာမည်နဲ့ download ရယူပါ။
composer create-project laravel/laravel laravel-crud
Step 2. Setup Database
Database တစ်ခုလိုအပ်တာမလို့ phpMyadmin ကိုသွားပြီး Database တစ်ခုကိုဖန်တီးလိုက်ပါ။ Database နာမည်ကို laravelcrud လို့ပေးလိုက်ပါ။ ပြီးသွားရင် laravel-crud ဆိုတဲ့ project မှာ .env file ကိုသွားပြီး Database Configuration လုပ်ဖို့အောက်ပါအတိုင်း ပြုပြင်ပြောင်းလဲမှုလေး လုပ်ပါ။
// .env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravelcrud
DB_USERNAME=root
DB_PASSWORD=
PostgreSQL အသုံးပြုတဲ့ သူတွေလည်းအဆင်ပြေအောင် ပြောပေးပါမယ်။ DB_CONNECTION မှာ Database အမျိုးအစားကိုထည့်လိုက်တာပါ။ MySQL Database မလို့ mysql ဆိုပြီး assign ချတာပါ။ PostgreSQL ဆိုရင်တော့ pgsql လို့ရေးပေးရပါတယ်။ DB_HOST ကတော့ Database host address ဖြစ်ပါတယ်။ 127.0.0.1 အစား localhost လို့လည်းပြောင်းရေးလို့ရပါတယ်။ DB_PORT ကတော့ Database port ဖြစ်ပါတယ်။ XAMPP ရဲ့ MSQL Port Error တက်ခဲ့လို့ 3307 ဘာညာပျင်ထားမိရင်တော့ 3307 လို့ပြောင်းထည့်ပေးရမှာဖြစ်ပါတယ်။ PostgreSQL ဆိုရင်တော့ 5432 ဖြစ်ပါတယ်။ DB_DATABASE ကတော့ ကိုဆောက်ထားခဲ့တဲ့ Database နာမည်ဖြစ်ပါတယ်။ DB_USERNAME နဲ့ DB_PASSWORD ကတော့ Database ရဲ့ username နဲ့ password ဖြစ်ကြပါတယ်၊ XAMPP မှာကတော့ Default အနေနဲ့ username က root ဖြစ်ပြီး နဲ့ password ကတော့ ပေးမထားပါဘူး။ PostgreSQL ကတော့ ကိုယ် PostgreSQL ကို Install လုပ်တုန်းက ပေးခဲ့တဲ့အတိုင်းပေးရမှာပါ။
Step 3. Create Model & Migration
Laravel မှာ table ကို migration လို့ခေါ်ပါတယ်။ table ကို manage or crud လုပ်ဖို့ သူ့အတွက် Model တစ်ခုလိုအပ်ပါတယ်။ ပြောချင်တာက articles ဆိုတဲ့ table ဆောက်မယ်ဆိုရင် Article ဆိုတဲ့ model ပါဆောက်ပေးရပါတယ်။ users ဆိုတဲ့ table ဆောက်မယ်ဆိုရင် User ဆိုတဲ့ model ပါဆောက်ပေးရပါတယ်။ ကျွန်တော်တို့က articles table ကို CRUD လုပ်မှာမလို့ articles ကိုပဲဆောက်ကြပါမယ်။ ၂ ခုစလုံးကို တစ်ကြိမ်တည်းနဲ့ ဆောက်ဖို့အောက်ပါအတိုင်း commad line ကို run ပေးပါ။
php artisan make:model Article -m
အပေါ်က php artisan make:model Article command ကဘာကို ဆိုလိုတာလဲဆိုတော့ Article ဆိုတဲ့ Model ကိုဆောက်ပေးပါ၊ -m ဆိုတာက articles ဆိုတဲ့ table ကိုပါတစ်ခါတည်းဆောက်ပေးပါလို့ဆိုလိုတာပေါ့။
Migration (table) File ကတော့
laravel-crud/database/migrations ဆိုတဲ့အောက်မှာ date_create_articles_table.php ဆိုပြီးရှိနေပါမယ်။ articles table ရဲ့ fields တွေကိုထည့်ဖို့ up() ဆိုတဲ့ method အောက်မှာ သွား ထည့်ရမှာပါ။
public function up()
{
Schema::create('articles', function (Blueprint $table) {
$table->id();
$table->string('title');
$table-text('content');
$table->timestamps();
});
}
Article ရဲ့ title ကတော့ VARCHAR 255 လောက်ပဲလိုတာမလို့ string လို့ထားပြီး content ကတော့ ရှည်နိုင်တာမလို့ text လို့ထားပေးလိုက်ပါ။ default အနေနဲ့ auto increment id နဲ့ created_at နဲ့ updated_at ဖြစ်လာမယ့် timestamps တွေရှိနေတာ တွေ့ရပါမယ်၊ လိုလို့ ဒီတိုင်းပဲထားလိုက်ပါ။
Model File ကတော့
laravel-crud/app/Models/ ဆိုတဲ့ အောက်မှာ Article.php ဆိုပြီးရှိနေပါမယ်။ Article Model ကိုသုံးပြီး mass assignment လုပ်လို့ရအောင် fillable ကိုအောက်ပါအတိုင်းသတ်မှတ်ပေးရပါတယ်။
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
use HasFactory;
protected $fillable = ['title', 'content'];
}
Fillable ရဲ့ array ထဲမှာ ကိုယ်က article table မှာဖန်တီးထားတဲ့ column name တွေအကုန်လုံး ကိုထည့်ပေးရတယ်လို့ပဲ မှတ်ထားလိုက်ပါ၊ အဓိပ္ပါယ်ကတော့ ဒီထက်တော့ မကပါဘူး။ ကဲဒါဆိုရင် ကိုယ် က table လည်းဖန်တီးပြီးပြီဆိုတော့ code တွေလောက်ပဲဖြစ်နေသေးတဲ့ migration file ကနေ phpMyAdmin မှာရှိနေတဲ့ Database ထဲမှာ articles table တစ်ခုဖြစ်သွားအောင် migrate လုပ်ပေးဖို့ အောက်ပါ command line ကို run ပေးပါ။
php artisan migrate
Step 4. Create Route for Article CRUD Operation
Laravel Project တွေရဲ့ အသက်ဖြစ်တဲ့ Route ကို
Laravel-crud/routes/web.php မှာ အောက်ပါအတိုင်း Route ကို Register လုပ်ပေးပါ။
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\ArticleController;
Route::resource('articles', ArticleController::class);
App\Http\Controllers အောက်မှာရှိတဲ့ ArticleController ကို use ထားပေးပါ။ တကယ်တော့ ဒီ ArticleController ကဆိုရင်မရှိသေးပါဘူး၊ နောက်မှဆောက်မယ့်ဟာကို ကြိုသုံးထားတာပါ။ Route ကိုတော့ resource route အဖြစ် Register လုပ်လိုက်ပါတယ်။ ကျွန်တော်တို့ register လုပ်လိုက်တဲ့ route က ‘articles’ ဆိုပြီးတစ်ခုတည်းပဲ ဆိုပေမယ့် တကယ် ဖြစ်သွားမှာက ဒီလိုပါ။
Method URI Controller Method
GET /articles index()
GET /articles/create create()
POST /articles store()
GET /articles/{id} show()
GET /articles/{id}/edit edit()
PUT /articles/{id} update()
DELETE /articles/{id} destroy()
Method ကဘာလဲ ဆိုတော့ URI အောက်မှာ ရှိတဲ့ url လေးတွေရဲ့ အလုပ်လုပ်ရမယ့် method ဖြစ်ပါတယ်။ Controller Method ကတော့ URI အောက်မှာ ရှိတဲ့ url လေးတွေ ကိုခေါ်လိုက်ရင် Controller ကနေ အလုပ်လုပ်ပေးမယ့် class method တွေဖြစ်ပါတယ်။ ဒါကို မြင်ချင်ရင် cmd or terminal မှာ
php artisan route:list
ဆိုတဲ့ command ကို run ပြီးသွားကြည့်လို့ရပါတယ်။ ဒါပေမယ့် Controller ကမဆောက်ရသေးဘူးဆိုတော့ Error ဖြစ်ပါတယ်၊ ArticleController ဆောက်ပြီးမှ run ကြည့်လိုက်ပါ။
Step 5. Create Resource Controller & CRUD Operation
ကဲဒါဆိုရင် ArticleController ကိုဆောက်ကြပါမယ်။ route ကို resource route အဖြစ် register လုပ်ခဲ့တာမလို့ Controller ကိုလည်း Resource Controller ကိုဆောက်ကြပါမယ်။ ဒီ command လေး run ပေးပါ။
php artisan make:controller ArticleController –r
အပေါ်က command ကဘာကိုဆိုလိုတာလဲ ဆိုတော့ ArticleController ကိုဆောက်ပေးပါ။ -r ဆိုတာကတော့ resource controller အဖြစ်နဲ့ဆောက်ပေးပါလို့ပြောတာပေါ့။ ဒီမှာပြောစရာရှိတာကဘာလဲဆိုတော့ Resource Controller ကဘာလဲပေါ့။ Resource Controller ကဆိုရင် Table တစ်ခုကို CRUD လုပ်လို့ရတဲ့ method တွေ တစ်ခါတည်းပါလာပြီးသားဖြစ်တဲ့ Controller ပဲဖြစ်ပါတယ်။ ဒီလိုပါ -
1. index()
2. create()
3. store(Request $request)
4. show($id)
5. edit($id)
6. update(Request $request)
7. destroy($id)
1. index() သည် article list ကို display လုပ်ပေးမယ့် page ကို ဖော်ပြပေးတဲ့ method ဖြစ်ပါတယ်။
2. create() သည် article တွေဖန်တီးရင် အသုံးပြုမယ့် form ကို ဖော်ပြပေးတဲ့ method ဖြစ်ပါတယ်။
3. store() သည် article တွေကို form ကနေတကယ် submit လုပ်တဲ့ အခါမှာ insert အလုပ်ကိုလုပ် ပေးမယ့် method ဖြစ်ပါတယ်။
4. show() သည် article တစ်ခုချင်းစီ detail ကြည့်ချင်တဲ့အခါ detail page ကိုဖော်ပြပေးမယ့် method ဖြစ်ပါတယ်။ ဒါပေမယ့် ဒီ project မှာမသုံးပါဘူး။
5. edit() သည် article တွေ update လုပ်ချင်ရင် အသုံးပြုမယ့် form ကို ဖော်ပြပေးတဲ့ method ဖြစ်ပါတယ်။
6. update() သည် article တွေကို edit form ကနေတကယ် submit လုပ်တဲ့ အခါမှာ update အလုပ်ကိုလုပ် ပေးမယ့် method ဖြစ်ပါတယ်။
7. destroy() သည် article တွေကို ဖျက်လိုက်ရင် အလုပ်လုပ်ပေးမယ့် method ဖြစ်ပါတယ်။
ကဲ ဒါဆိုရင် ArticleController File ထဲမှာ အောက်ပါအတိုင်း Article ရဲ့ CRUD Operation ကိုရေးလိုက် လို့ရပါပြီ။ ဒီလိုဖြစ်ပါမယ် -
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Article;
class ArticleController extends Controller
{
public function index()
{
$articles = Article::all();
return view('article.index', compact('articles'));
}
public function create()
{
return view('article.create');
}
public function store(Request $request)
{
$data = $request->validate([
'title' => 'required',
'content' => 'required',
]);
Article::create($data);
return redirect('articles');
}
public function show($id)
{
//
}
public function edit($id)
{
$article = Article::find($id);
return view('article.edit', compact('article'));
}
public function update(Request $request, $id)
{
$data = $request->validate([
'title' => 'required',
'content' => 'required',
]);
Article::find($id)->update($data);
return redirect('articles');
}
public function destroy($id)
{
Article::find($id)->delete();
return back();
}
}
အပေါ်က ArticleController ထဲမှာ ရေးထားတဲ့ Method တစ်ခုချင်းစီကို လိုတိုရှင်း ရှင်းပြပေးပါမယ်။
# index() method
public function index()
{
$articles = Article::all();
return view('article.index', compact('articles'));
}
Index() method လေးမရှင်းပြမီမှာပြောချင်တာက၊ ပထမဆုံး အနေနဲ့ Article model ကို အသုံးပြုလို့ရအောင် use ထားရပါတယ်။
Article Model ကနေ all() ဆိုတဲ့ static method ကိုအသုံးပြုပြီး article list တွေကို ဆွဲထုတ်လိုက်ပါတယ်။ ရလာတဲ့ data ကို $articles ဆိုတဲ့ Variable ထဲကိုထည့်ပြီး article folder ထဲက index ဆိုတဲ့ blade file ကနေ display လုပ်လို့ရအောင် compact() function ကိုအသုံးပြုပြီး ပို့လိုက်တာပါ။ တကယ်တော့ article/index.blade.php ဆိုတဲ့ blade file ကမရှိသေးပါဘူး၊ နောက်တည်ဆောက်ကြမှာပါ။
# create() method
public function create()
{
return view('article.create');
}
create() ကတော့ Create Form Page ဖြစ်တဲ့ article/create.blade.php File ကို return view() ကိုသုံးပြီး ဖော်ပြပေးတာပါ။
# store() method
public function store(Request $request)
{
$data = $request->validate([
'title' => 'required',
'content' => 'required',
]);
Article::create($data);
return redirect('articles');
}
store() method က create form ကနေ submit လုပ်လိုက်တဲ့ input fields တွေကို validate လုပ်တယ်၊ ပြီးတော့ validate လုပ်ထားတဲ့ input field တွေကိုပဲ $data ဆိုတဲ့ variable ထဲကိုထည့်ပြီး create() ဆိုတဲ့ static method ကိုအသုံးပြုပြီး insert လုပ်တယ်။ ပြီးရင် index page ကို redirect လုပ်လိုက်တယ်။
# edit() method
public function edit($id)
{
$article = Article::find($id);
return view('article.edit', compact('article'));
}
edit() method က $id နဲ့ ညီတဲ့ Article ကို find() method ကိုအသုံးပြုပြီးဆွဲထုတ်လိုက်တယ်၊ ရလာတဲ့ article data ကို edit form ရှိတဲ့ article/edit.blade.php file သို့ compact() နဲ့ပို့လိုက်တယ်။
# update() method
public function update(Request $request, $id)
{
$data = $request->validate([
'title' => 'required',
'content' => 'required',
]);
Article::find($id)->update($data);
return redirect('articles');
}
edit form ကနေ submit လုပ်လိုက်တဲ့ input field တွေကို validate လုပ်ပြီး $data ဆိုတဲ့ variable ထဲကို ထည့်လိုက်တယ်၊ ပြီးရင် $id ညီတဲ့ Article ကို find() method နဲ့ ရှာပြီး update() ဆိုတဲ့ method နဲ့ validated data နဲ့ article ကို update လုပ်လိုက်တယ်။ ပြီးရင် index page ကို redirect လုပ်လိုက်တယ်။
# destroy() method
public function destroy($id)
{
Article::find($id)->delete();
return back();
}
destroy() method ကတော့ $id နဲ့ညီတဲ့ Article ကို ရှာပြီး delete() ဆိုတဲ့ function နဲ့ဖျက်လိုက်တယ်ပေါ့။ ကဲဒါဆိုရင် ArticleController ထဲမှာရှိကြတဲ့ method တစ်ခုချင်းစီရဲ့အလုပ်လုပ်ပုံကို နားလည်ကြမယ်ထင်ပါတယ်။
Step 6. Create Blade or View Files
ArticleController ကနေ return လိုက်တဲ့ view file တွေကို အောက်ပါအတိုင်း resources/views ဆိုတဲ့ folder ကနေဖန်တီးလိုက်ပါ။
article/index.blade.php
article/create.blade.php
article/edit.blade.php
ကဲ blade file တွေလည်းဖန်တီးပြီးပြီဆိုတော့ file တစ်ခုချင်းစီမှာ အောက်ပါအတိုင်း code တွေကိုရေးလိုက်ပါ။ ဒါပေမယ့် ကျွန်တော်က တော့ blade file မှာရေးထားတဲ့ code တွေကိုတော့ မရှင်းပြတော့ပါဘူး၊ အဓိက ဖြစ်တဲ့ Controller က code တွေကိုရှင်းပြလိုက်ပြီမလို့ပါ၊ ဒီလောက်လေးက ကိုယ့်ကို ကြည့်ပြီး နားလည်နိုင်မယ်လို့ ယူဆထားလို့ပါ။
# index.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
<title>laravl-crud</title>
</head>
<body>
<h5> Article List </h5>
<table>
<thead>
<tr>
<th>ID</th>
<th>Title</th>
<th>Content</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
@foreach($articles as $article)
<tr>
<td>{{ $article->id }}</td>
<td>{{ $article->title }}</td>
<td>{{ $article->content }}</td>
<td>
<form action="{{ url('articles/' . $article->id) }}" method="post">
@csrf
@method('delete')
<a href="{{ url('articles/'.$article->id.'/edit') }}">Edit</a>
<button type="submit">Delete</button>
</form>
</td>
</tr>
@endforeach
</tbody>
</table>
</body>
</html>
# create.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
<title>laravel-crud</title>
</head>
<body>
<h5>Article Create Form</h5>
<form action="{{ url('articles') }}" method="post">
@csrf
<div>
<input type="text" name="title" placeholder="Enter article title" value="{{ old('title') }}">
<span style="color: red;">{{$errors->first('title')}}</span>
</div>
<div>
<textarea name="content" cols="30" rows="5" placeholder="Enter article content">{{ old('content') }}</textarea>
<span style="color: red;">{{$errors->first('content')}}</span>
</div>
</form>
</body>
</html>
# edit.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
<title>laravel-crud</title>
</head>
<body>
<h5>Article Create Form</h5>
<form action="{{ url('articles/'.$article->id) }}" method="post">
@csrf
@method('put')
<div>
<input type="text" name="title" placeholder="Enter article title" value="{{ old('title') ?? $article->title }}">
<span style="color: red;">{{$errors->first('title')}}</span>
</div>
<div>
<textarea name="content" cols="30" rows="5" placeholder="Enter article content">{{ old('content') ?? $article->content }}</textarea>
<span style="color: red;">{{$errors->first('content')}}</span>
</div>
</form>
</body>
</html>
Step 7. Run the Laravel Project
ကဲ code တွေလည်း အားလုံးရေးပြီးသွားပြီဆိုတော့ laravel-crud project ကို browser ကနေ ကြည့်လို့ရအောင် အောက်က command ကိုသုံးပြီး run ပေးပါ။
php artisan serve
အပေါ်က command ကို run လိုက်ရင်
INFO Server running on [http://127.0.0.1:8000].
Press Ctrl+C to stop the server
...
...
ဒီလိုလေးပေါ်လာပါမယ်။
Browser ကိုသွားပြီး 127.0.0.1:8000 ဆိုပြီးသွား browse လုပ်လိုက်လို့ရပါပြီ၊ အဆင်ပြေသွားမှာပါ။
Ye Myint Soe (Salai)
Hornbill Technology
18.12.2022