Trong các bài trước chúng ta đã học cách chèn nội dung vào database trong Laravel một cách thủ công hoặc tự động ngẫu nhiên rồi phải không nào. Thế nhưng thực tế chả ai làm vậy cả mà sẽ nhập dữ liệu một cách trực quan. Đây là lý do bài này ra đời. Trong bài viết này chúng ta sẽ học cách tạo view insert database Laravel nhé các bạn!
Insert database bằng view
Bài học này chúng mình sẽ hướng dẫn các bạn chèn thêm dữ liệu vào database (gọi là insert) từ trang view của Admin.
Nội dung bài học này chỉ đề cập đến việc chèn dữ liệu vào database, không đề cập đến xử lý dữ liệu nhập muốn xử lý dữ liệu nhập mời các bạn xem lại bài Validation Laravel
Trước tiên ta cần tạo một bảng dữ liệu rỗng như sau bằng phpMyAdmin hoặc sử dụng Migrate như bài trước. Ta tạo table news với các cột như sau:
Các chuẩn bị
Để thực hiện việc insert dữ liệu vào database ta làm các thao tác sau:
- Tạo view cho trang nhập dữ liệu news_create.blade.php, và đặt trong thư mục /resources/views/admin/
- Tạo một controller điều khiển các hoạt động của trang news, bao gồm: view, insert, update, delete.
- Route điều khiển hiển thị của trang nhập dữ liệu news_create.blade.php.
- Tạo một Model để khai báo, xử lý table khi cần.
Các file xử lý sẽ thuộc cấu trúc sau:
Tạo trang insert dữ liệu
/resources/views/admin/news_create.blade.php
Các bạn truy cập thư mục /resources/views/admin/ tạo file PHP news_create.blade.php với nội dung sau:
<form method="post" action="/admin/news/store"> @method('PATCH') @csrf <p> <label for="title">Title</label><br> <input type="text" name="title" value=""> </p> <p> <label for="email">Email</label><br> <input type="text" name="email" value=""> </p> <p> <label for="description">Description</label><br> <textarea cols="20" rows="10" name="description"></textarea> </p> <p> <button type="submit">Submit</button> </p> </form>
Tạo Controller điều khiển các hoạt động của trang news.
Ta sử dụng lệnh Artisan để tạo AdminNewsController, nếu chưa biết cách tạo như thế nào thì bạn cần xem lại bài học về Controller
php artisan make:controller /Admin/AdminNewsController --resource
Giải thích câu lệnh
- Admin: là tên folder sẽ được tạo tự động.
- AdminNewsController: là tên file Controller.
- --resource: đây là khai báo tạo file Controller có sẵn nội dung điều khiển.
Truy cập vào Controller theo đường dẫn /app/Http/Controllers/Admin/ có chứa file AdminNewsController.php vừa tạo với nội dung sau:
{ /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { // } /** * Show the form for creating a new resource. * * @return \Illuminate\Http\Response */ public function create() { // } /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { // } /** * Display the specified resource. * * @param int $id * @return \Illuminate\Http\Response */ public function show($id) { // } /** * Show the form for editing the specified resource. * * @param int $id * @return \Illuminate\Http\Response */ public function edit($id) { // } /** * Update the specified resource in storage. * * @param \Illuminate\Http\Request $request * @param int $id * @return \Illuminate\Http\Response */ public function update(Request $request, $id) { // } /** * Remove the specified resource from storage. * * @param int $id * @return \Illuminate\Http\Response */ public function destroy($id) { // } }
Trong đó :
- index(): Điều khiển hiển thị danh sách dữ liệu.
- create(): Điều khiển trang insert dữ liệu.
- store(Request $request): Thực hiện việc insert dữ liệu.
- show($id): Hiển thị dữ liệu riêng biệt dựa theo $id.
- edit($id): Hiển thị trang cập nhật dữ liệu.
- update(Request $request, $id): Thực thi việc cập nhật dữ liệu.
- destroy($id): Xóa dữ liệu.
Chúng ta tiến hành thêm nội dung cho function create() của Controller AdminNewsController để gọi trang view insert:
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
return view('/admin/news_create');
}
Nội dung trên chỉ đơn giản là gọi trang view /admin/news_create
Khai báo Route
Ta thêm vào Route /routes/web.php nội dung sau:
use App\Http\Controllers\Admin\AdminNewsController; Route::get('/admin/news/create',[AdminNewsController::class,'create']);
Trong đó
- use App\Http\Controllers\Admin\AdminNewsController; khai báo controller theo cú pháp laravel 8
- Route::get('/admin/news/create',[AdminNewsController::class,'create']); khai báo routes cú pháp laravel 8
- /admin/news/create: đường dẫn tới trang insert dữ liệu.
- AdminNewsController: Tên controller
- create: Đây là function create() trong Controller AdminNewsController.
Hiển thị trang view insert:
Bây giờ chúng ta thử gõ đường dẫn http://localhost:8000/admin/news/create lên trình duyệt, ta sẽ xem được nội dung sau:
Tiến hành insert dữ liệu
Trong trang view: insert dữ liệu /resources/views/admin/news_create.blade.php ta cho form khi nhấn submit sẽ thực hiện một action tới /admin/news/store, do đó ta cần tạo một Controller để xử lý lưu dữ liệu nhập, và một Route điều hướng tới Controller này, ta thực hiện như sau:
Điều chỉnh nội dung Route
Ta thêm vào Route /routes/web.php nội dung sau:
use App\Http\Controllers\Admin\AdminNewsController; Route::get('/admin/news/create',[AdminNewsController::class,'create']); Route::post('/admin/news/store',[AdminNewsController::class, 'store']);
Trong đó
- /admin/news/store: đường dẫn tới trang insert dữ liệu.
- AdminNewsController: Controller AdminNewsController.
- create: Đây là function create() trong Controller AdminNewsController.
Xử lý Controller
Tiến hành xử lý nội dung insert dữ liệu cho Controller, viết lại Controller /app/Http/Controllers/Admin/AdminNewsController.php tại phần khai báo và public function store(Request $request) như sau:
<?php namespace App\Http\Controllers\Admin; use App\News; use Illuminate\Http\Request; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Redirect; class AdminNewsController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { $news = DB::table('news')->select('*'); $news = $news->get(); $pageName = 'Tên Trang - News'; return view('/admin/news', compact('news', 'pageName')); } /** * Show the form for creating a new resource. * * @return \Illuminate\Http\Response */ public function create() { return view('/admin/news_create'); } /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { $news = new News; $news->title = $request->title; $news->email = $request->email; $news->description = $request->description; $news->save(); action([AdminNewsController::class, 'create']); return Redirect::action([AdminNewsController::class, 'create']); } /** * Display the specified resource. * * @param int $id * @return \Illuminate\Http\Response */ public function show($id) { $news = News::where('id', '=', $id)->select('*')->first(); $des = html_entity_decode($news->description); return view('/admin/news_detail', compact('news', 'des')); } /** * Show the form for editing the specified resource. * * @param int $id * @return \Illuminate\Http\Response */ public function edit($id) { $news = News::findOrFail($id); $pageName = 'News - Update'; return view('/admin/news_update', compact('news', 'pageName')); } /** * Update the specified resource in storage. * * @param \Illuminate\Http\Request $request * @param int $id * @return \Illuminate\Http\Response */ public function update(Request $request, $id) { // } /** * Remove the specified resource from storage. * * @param int $id * @return \Illuminate\Http\Response */ public function destroy($id) { // } }
Trong đó :
- use App\News;: đây là khai báo Model News khai báo cho table news trong Database.
- use Illuminate\Support\Facades\Redirect; khai baos redirect
- $news = new News;: Gọi Model News và gán cho biến $news.
- Tiến hành xử lý dữ liệu từ form (từ thuộc tính name của input):
- $news->title = $request->title
- $news->email = $request->email
- $news->description = $request->description
- $news->save(): save vào table news trong Database.
- action([AdminNewsController::class, 'create']);
return Redirect::action([AdminNewsController::class, 'create']); : Sau khi thực hiện xong, gọi lại function create của Controller AdminNewsController, nội dung fuction này là hiển thị lại trang view insert.
Model News, khai báo table
Việc cuối cùng chúng ta cần khai báo Model News để nhận biết table nào cần xử lý, ta thực hiện tạo Model news như sau, sử dụng lệnh Artisan để tạo Model News:
php artisan make:model News
Kết quả chạy đúng như sau là bạn tạo thành công:
Ta thực hiện khai báo cho table news trong Database như sau:
{
protected $table='news';
}
Vậy là xong chúng ta đã tạo xong trang insert dữ liệu trong Laravel rồi đấy. Các bạn vào trang
http://localhost:8000/admin/news/create và thực hiện chèn dữ liệu vào.
Ví dụ ở dây chúng tôi chèn thêm Pháp phap@mgail.com CNTT vào database
Kết quả
Vậy là ok rồi đấy chúng ta đã biết cách tạo view chèn dữ liệu vào database trong Laravel thành công rồi các bạn ạ. Chúc các bạn học tốt!