در این مطلب آموزش insert اطلاعات فرم در لاراول را با استفاده از Eloquent در فریم ورک محبوب لاراول ارائه خواهیم داد.
همانطور که می دونید ما در پروژه های واقعی اطلاعات رو از یک فرم دریافت می کنیم، به همین خاطر در ابتدا من نیاز به یک فرم دارم اما قبل از اون باید با نحوه پیکربندی دیتابیس و ایجاد جداول در دیتابیس هم آشنا باشم، اگر هنوز این موارد رو نمی دونید در دسته مقاله های آموزش لاراول این مطالب رو مطالعه کنید.
جدولی به نام “posts” نیز با ساختار زیر در دیتابیسی به نام “laravelapp” ایجاد کردم.
از اونجا که برای کار با پردازش های دیتابیس و استفادهاز Eloquent نیاز به Model ها داریم، یک “Model” به نام “Post” در پروژه ساختم.
ما به دو روش می تونیم اطلاعات رو از طریق ابزار Eloquent از فرم دریافت و در جدول دیتابیس ذخیره کنیم که در ادامه به آنها می پردازیم.
روش های ثبت اطلاعات فرم با استفاده از Eloquent در لاراول
- استفاده از Object
- استفاده از Model
هر کدام را با مثال توضیح خواهم داد.
1. آموزش ثبت اطلاعات فرم در لاراول (استفاده از Object Oriented PHP)
به صورت مرحله مرحله پیش میریم تا درک مطالب ساده تر باشه.
1) فرم خودم رو در فایلی به نام “create.blade.php” در مسیر زیر ایجاد کردم.
resources -> views -> blog -> create.blade.php
برای استایل دهی از فریم ورک tailwind استفاده کردم، (آموزش نصب و پیکربندی Tailwind CSS در لاراول):
Document
@vite('resources/js/app.js')
Add new post
2) نیاز به یک کنترلر جهت مدیریت روت ها داریم به همین خاطر یک کنترلر با نام “PostController” ایجاد و کدهای زیر رو داخلش می نویسم.
DB::table('posts')->orderBy('id', 'desc')->get()]);
}
public function create()
{
return view('blog.create');
}
public function store(Request $request)
{
//dd($request->all());
$post = new Post();
$post->title = $request->title;
$post->excerpt = $request->excerpt;
$post->body = $request->body;
$post->image_path = 'temporary';
$post->is_published = $request->is_published === 'on';
$post->min_to_read = $request->min_to_read;
$post->save();
return redirect(route('blog.index'));
}
public function show($id)
{
return view('blog.show', [
'post'=> Post::findOrFail($id)
]);
//return $id;
}
public function edit($id)
{
//
}
public function update(Request $request, $id)
{
//
}
public function destroy($id)
{
//
}
}
3) برای معرفی روت های کنترلر فایل “web.php” رو باز می کنم و بدین شکل متدها رو تعریف می کنم.
نکته مهم: روت مربوط به فرم یا insert اطالاعات باید در ابتدا معرفی شود و بعد سایر روت ها تعریف شوند. (خط کد 12)
group(function () {
Route::get('/create', [PostController::class, 'create'])->name('blog.create');
Route::get('/', [PostController::class, 'index'])->name('blog.index');
Route::get('/{id}', [PostController::class, 'show'])->name('blog.show');
Route::post('/', [PostController::class, 'store'])->name('blog.store');
Route::get('/edit/{id}', [PostController::class, 'edit'])->name('blog.edit');
Route::patch('/{id}', [PostController::class, 'update'])->name('blog.update');
Route::delete('/{id}', [PostController::class, 'destroy'])->name('blog.destroy');
});
Route::get('/', HomeController::class);
Route::fallback(FallbackController::class);
اگر مراحل رو به درستی طی کرده باشید با اطلاعات فرم به درستی در جدول شما درج خواهند شد.
2. آموزش ثبت اطلاعات فرم در لاراول (استفاده از Model)
1) برای اینکار در مثال قبل فایل “PostController” رو باز کنید و متد بخش store رو به شکل زیر تغییر بدید.
public function store(Request $request)
{
Post::create([
'title' => $request->title,
'excerpt' => $request->excerpt,
'body' => $request->body,
'image_path' => 'temporary',
'is_published' => $request->is_published === 'on',
'min_to_read' => $request->min_to_read,
]);
return redirect(route('blog.index'));
}
2) در این روش لاراول برای اینکه داده ای به صورت تصادفی یا اشتباه درج نشه از ما می خواد که فیلدهای جدول رو به شکل “protexted” در Model خودمون تعریف کنیم. وارد فایل Modal ای که ایجاد کردم میشم (Post) و کدهای زیر رو می نویسم:
ما در فرمی که ایجاد کردیم گزینه آپلود تصویر هم داریم، آپلود و ذخیزه سازی تصویر رو به چه شکل باید انجام بدیم؟
آپلود فایل و تصویر در لاراول
ما فایل ها رو به صورت مستقیم در دیتابیس ذخیره نمی کنیم، ابتدا آنها رو در پوشه ای مشخص ذخیره می کنیم و بعد مسیر و نام فایل رو در فیلد مربوطه در جدول دیتابیس درج می کنیم.
برای اینکار فایل کنترلر “PostController” رو باز کنید و در انتهای همه متدها یک متد جدید به شکل “private” که فقط برای دیافت و ذخیره کردن تصویر هست ایجاد می کنیم.
private function storeImage($request) {
$newImageName = uniqid() . '-' . $request->title . '.' .
$request->image->extension();
return $request->image->move(public_path('images'), $newImageName);
}
متد “store” رو هم به شکل زیر تغییر میدم:
public function store(Request $request)
{
Post::create([
'title' => $request->title,
'excerpt' => $request->excerpt,
'body' => $request->body,
'image_path' => $this->storeImage($request),
'is_published' => $request->is_published === 'on',
'min_to_read' => $request->min_to_read,
]);
return redirect(route('blog.index'));
}
در نهایت کدینگ فایل کنترلر “PostController” به شکل زیر خواهد بود.
DB::table('posts')->orderBy('id', 'desc')->get()]);
}
public function create()
{
return view('blog.create');
}
public function store(Request $request)
{
Post::create([
'title' => $request->title,
'excerpt' => $request->excerpt,
'body' => $request->body,
'image_path' => $this->storeImage($request),
'is_published' => $request->is_published === 'on',
'min_to_read' => $request->min_to_read,
]);
return redirect(route('blog.index'));
}
public function show($id)
{
return view('blog.show', [
'post'=> Post::findOrFail($id)
]);
//return $id;
}
public function edit($id)
{
//
}
public function update(Request $request, $id)
{
//
}
public function destroy($id)
{
//
}
private function storeImage($request) {
$newImageName = uniqid() . '-' . $request->title . '.' .
$request->image->extension();
return $request->image->move(public_path('images'), $newImageName);
}
}
و تمام!
جمع بندی
در این مقاله سعی کردم روش های دیافت و درج اطلاعات از فرم در لاراول رو به همراه مثال توضیح بدم. امیدوارم این مطلب براتون مفید واقع شده باشه.
لطفا اگر نظر و پیشنهادی در خصوص مطالب و پیشبرد آنها دارید خوشحال میشم در قسمت دیدگاه ها مطرح بفرمایید.