Insert database

Insert database

  • Bài học này sẽ giúp chúng ta 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 chỉ muốn giúp các bạn hiểu rõ hơn cách thêm dữ liệu vào database, không đề cập đến xử lý dữ liệu nhập, nếu cần thì các bạn xem thêm ở phần validate form nhe.
  • 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 Migrate - database, ta tạo table news với các cột như sau:

Laravel Insert

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:

myproject

Tạo trang insert dữ liệu /resources/views/admin/news_create.blade.php

Vào 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
  • /Admin/AdminNewsController

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

Kết quả chạy đúng như sau là bạn tạo thành công:

Laravel Insert

Khi này, kiểm tra trong thư mục Controller /app/Http/Controllers/Admin/ có chứa file AdminNewsController.php vừa tạo với nội dung sau:

<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class AdminNewsController extends Controller
{
    /**
     * 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)
    {
        //
    }
}
  • 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.

Thêm nội dung Route

Ta thêm vào Route /routes/web.php nội dung sau:

Route::get('/admin/news/create', 'Admin\AdminNewsController@create');
  • /admin/news/create: đường dẫn tới trang insert dữ liệu.
  • Admin\AdminNewsController: thư mục Admin chứa Controller AdminNewsController.
  • create: Đây là function create() trong Controller AdminNewsController.

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

Hiển thị trang view insert:

Gõ đường dẫn http://localhost:82/admin/news/create lên trình duyệt, ta sẽ xem được nội dung sau:

Laravel Insert

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:

Route::get('/admin/news/create', 'Admin\AdminNewsController@create');
Route::post('/admin/news/store', 'Admin\AdminNewsController@store');
  • /admin/news/store: đường dẫn tới trang insert dữ liệu.
  • Admin\AdminNewsController: thư mục Admin chứa 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;

class AdminNewsController extends Controller
{
    /**
     * 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()
    {
        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();
        return redirect()->action('Admin\AdminNewsController@create');
    }

    /**
     * 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)
    {
        //
    }
}
  • use App\News;: đây là khai báo Model News khai báo cho table news trong Database.
  • $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.
  • return redirect()->action('Admin\AdminNewsController@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

Tới đây ta gần như hoàn thành việc insert dữ liệu vào Database, thiếu duy nhất là 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:

Laravel Insert

Khi này, kiểm tra trong thư mục /app/ sẽ thấy file Modal News.php vừa tạo với nội dung sau:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class News extends Model
{
    //
}

Ta thực hiện khai báo cho table news trong Database như sau:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class News extends Model
{
    protected $table='news';
}

Tới đây là ta đã hoàn thành việc tạo trang insert dữ liệu, ta có thể tiến hanh insert dữ liệu để xem nội dung có được thêm vào table news trong Database hay không.

Laravel Insert

Kiểm tra table news trong phpMyAdmin hiển thị dữ liệu vừa nhập như sau là thành công:

Laravel Insert

Nội dung bài học chỉ tập trung vào việc insert dữ liệu vào Database thôi nhe, việc xử lý hay validate form thì các bạn xem thêm tại bài Validate form nhe.