Tổng kết database Laravel

Trong các bài trước chúng ta đã học về Insert - View - Detail - Update - Delete Database trong Laravel rồi phải không nào. Thế nhưng nội dung không xuyên suốt vì vậy trong nội dung bài viết này chúng ta sẽ tổng kết database Laravel lại một lượt qua các bài đã học ở trước thành 1 bài hoàn chỉnh các bạn nhé!

Cấu trúc project đã tạo xuyên suốt các bài học

Chúng ta sử dụng mô hình MVC để minh họa ví dụ xuyên suốt bài học

  • Model: News để khai báo bảng trong cơ sở dữ liệu
  • View : Các view để chèn dữ liệu, xem, sửa, xóa dữ liệu
  • Controller : AdminController điều khiển các thao tác với dữ liệu

Nội dung các file và các bước thực hành 

1. Tạo cơ sở dữ liệu bằng phpMyadmin trong xampp sau đó kết nối với cơ sở dữ liệu

Cách kết nối CSDL như sau:

Tìm file .env tìm đoạn mã sau và sửa lại tên theo cơ sở dữ liệu bạn tạo.  Ví dụ ở đây chúng mình có database là college 

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=college 
DB_USERNAME=root
DB_PASSWORD=

2. Tạo bảng dữ liệu news 

Với các trường id,title,email,description. Có thể tạo bằng phpMyadmin hoặc tạo bằng Migration

Code tạo bằng Migration:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateNewsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('news', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->string('email');
            $table->string('description');
            $table->timestamps();
        });
    }


    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('news');
    }
}

Sau khi tạo xong chúng ta có bảng dữ liệu trống như sau:

3. Nội dung file Model News

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class News extends Model{
    protected $table='news';
}

4. Nội dung các View

a. View - insert dữ liệu.

/resources/views/admin/news_create.blade.php

<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>

b. View - hiển thị danh sách dữ liệu.

/resources/views/admin/news.blade.php

<h2 class="box-title">{{ $pageName }}</h2>
<table border="1">
    <thead>
        <tr>
            <th>ID</th>
            <th>Title</th>
            <th>Email</th>
            <th>Tools</th>
        </tr>
    </thead>
    <tbody>
        @foreach($news as $row)
        <tr>
            <td>{{$row->id}}</td>
            <td><a href="/admin/news/{{$row->id}}">{{$row->title}}</a></td>
            <td>{{$row->email}}</td>
            <td><a href="/admin/news/edit/{{$row->id}}">Edit</a><br>
                <form method="POST" action="/admin/news/delete/{{$row->id}}" onsubmit="return ConfirmDelete( this )">
                    @method('DELETE')
                    @csrf
                    <button type="submit">Delete</button>
                </form>
            </td>
        </tr>
        @endforeach
    </tbody>
</table>

c. View - hiển thị chi tiết dữ liệu.

/resources/views/admin/news_detail.blade.php

<h1>News</h1>
<h2>{{ $news->title }}</h2>
<p>{{ $news->email }}</p>
<div>{!! $des !!}</div>

d. Trang view - update dữ liệu.

/resources/views/admin/news_update.blade.php

<h2>{{ $pageName }}</h2>
<form method="post" action="/admin/news/update/{{ $news->id }}">
    @method('PATCH')
    @csrf
    <input type="hidden" name="id" value="{{ $news->id }}">
    <p>
        <label for="title">Title</label><br>
        <input type="text" name="title" value="{{ $news->title }}">
    </p>
    <p>
        <label for="email">Email</label><br>
        <input type="text" name="email" value="{{ $news->email }}">
    </p>
    <p>
        <label for="description">Description</label><br>
        <textarea cols="50" rows="5" name="description">{{ $news->description }}</textarea>
    </p>
    <p>
        <button type="submit">Submit</button>
    </p>
</form>

5. Controller chứa các function xử lý: Insert - View - Detail - Update - Delete.

/app/Http/Controllers/Admin/AdminNewsController.php

<?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)
    {
        $news = News::find($id);
        $news->title = $request->title;
        $news->email = $request->email;
        $news->description = $request->description;
        $news->save();       
        action([AdminNewsController::class, 'index']);
        return Redirect::action([AdminNewsController::class, 'index']);      
    }
    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {  
        $news = News::find($id);
        $news->delete();
        action([AdminNewsController::class, 'index']);
        return Redirect::action([AdminNewsController::class, 'index']);
    }
}

6. File điều khiển Route.

/routes/web.php

use App\Http\Controllers\Admin\AdminNewsController;
Route::get('/admin/news/create',[AdminNewsController::class,'create']);
Route::post('/admin/news/store',[AdminNewsController::class, 'store']);
Route::get('/admin/news',[AdminNewsController::class, 'index']);
Route::get('/admin/news/{id}',[AdminNewsController::class,'show']);
Route::get('/admin/news/edit/{id}',[AdminNewsController::class, 'edit']);
Route::PATCH('/admin/news/update/{id}', [AdminNewsController::class, 'update']);
Route::DELETE('/admin/news/delete/{id}', [AdminNewsController::class,'destroy']);

Lời kết:

Trong các bài học Insert - View - Detail - Update - Delete này chúng mình chỉ chú trọng cách trình bày cho người đọc hiểu rõ cách thức hoạt động ra sao vì vậy không xác thực form và xử lý dữ liệu cần thiết. mong các bạn thông cảm. Hãy thử ví dụ trên để hiểu rõ cách giao tiếp với database trong Laravel như thế nào các bạn nhé. Chúc các bạn học tốt!

Bình luận