Ra mắt hai series mới cực hot Trí tuệ nhân tạo A đến ZPython công cụ không thể thiếu khi nghiên cứu Data science, Machine learning.

Todo List: Thiết lập kết nối CSDL và tạo bảng với Laravel Migration

Video trong bài viết

Hôm nay, chúng ta sẽ tiếp tục phần còn lại của mô hình MVC đó chính là Model. Model là thành phần kết nối cơ sở dữ liệu, xử lý dữ liệu và chuẩn bị dữ liệu để chuyển đến các thành phần khác.

Mô hình MVC

Laravel Model

Laravel Model là các class giúp chúng ta tương tác với database. Mỗi bảng trong database sẽ tương ứng với một Model. Model cho phép chúng ta truy vấn dữ liệu từ bảng, thêm, sửa xóa các bản ghi.

Các file class cho Laravel Model được lưu trong thư mục app, nó cũng có namespace dựa theo thư mục để Composer có thể autoloading và các class này được mở rộng từ class Illuminate\Database\Eloquent\Model.

Model có thể được tạo bằng tay hoặc thông qua công cụ dòng lệnh artisan.

php artisan make:model Todo

Khi đó, kiểm tra thư mục app bạn sẽ thấy một file là Todo.php. Mặc định Model này sẽ ánh xạ 1-1 với bảng todos trong database. Tuy nhiên, hiện giờ chúng ta chưa có database nào cả.

Thiết lập kết nối đến database

Trong thư mục dự án chúng ta có một file .env, đây là file chứa các thiết lập môi trường, bạn sẽ thấy có một đoạn để thiết lập các thông tin kết nối đến database, thay đổi theo thông tin của dự án như sau:

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

Các thiết lập bao gồm:

  • DB_CONNECTION: Dạng CSDL sẽ kết nối đến, có thể là MySQL, SQL Server, PostgreSQL, ở đây chúng ta sử dụng MySQL.
  • DB_HOST: Địa chỉ IP của máy chủ database, chúng ta cài MySQL trên máy cá nhân nên dùng địa chỉ 127.0.0.1 chính là địa chỉ IP cục bộ của máy tính chúng ta luôn.
  • DB_PORT: Cổng hoạt động của database, với MySQL mặc định là 3306.
  • DB_DATABASE: Tên database, trong ứng dụng Todo List chúng ta tạo database tên là todos_app.
  • DB_USERNAME: Tên đăng nhập database, với MySQL dùng trên máy cá nhân thì dùng user root và mật khẩu trắng.
  • DB_PASSWORD: Mật khẩu đăng nhập

Để tạo database todo-app chúng ta có nhiều cách, sử dụng các công cụ đồ họa như Sequel Pro, Heidi SQL(được cài đặt sẵn trong Laragon), phpMyAdmin (ứng dụng web) hoặc thậm chí là sử dụng các lệnh trong môi trường dòng lệnh:

C:\laragon\www\todo-app
λ mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 173
Server version: 5.7.24 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database todos_app;
Query OK, 1 row affected (0.32 sec)

mysql> exit
Bye

Như vậy chúng ta đã có database todos_app và model Todo, chúng ta cần có một bảng dữ liệu todos trong database todos_app nữa.

Laravel Migration

Bảng todos ở trên có thể tạo bằng tay, tuy nhiên trong Laravel có một cách thức để tạo, chỉnh sửa, xóa các bảng trong database là thông qua Laravel Migration. Tại sao phải dùng Laravel Migration?

Laravel Migration giúp cho việc kiểm soát phiên bản database dễ dàng, các thay đổi cấu trúc bảng trong database được đưa vào các class PHP, như vậy có thể kiểm soát phiên bản hiện hành của database. Ví dụ trong làm việc nhóm, một lập trình viên A thêm vào một bảng dữ liệu mới, khi lập trình viên A commit, lập trình viên B có thể checkout và chỉ thực hiện một câu lệnh là có database với cấu trúc mới này. Toẹt quá còn gì?

Để tạo ra các file migration, chúng ta sử dụng câu lệnh artisan:

C:\laragon\www\todo-app
λ php artisan make:migration create_todos_table
Created Migration: 2019_06_18_145622_create_todos_table

Một file 2019_06_18_145622_create_todos_table.php sẽ được tạo ra trong thư mục database/migrations.

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateTodosTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('todos', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->timestamps();
        });
    }

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

Các file migration sẽ có hai phương thức là up() và down(), phương thức up() được dùng để tạo ra các bảng, các trường dữ liệu còn phương thức down() được sử dụng để đảo ngược lại hành động của up(). Sau đó, để thực hiện các file migration này chúng ta thực hiện lệnh php artisan migrate:

C:\laragon\www\todo-app
λ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table
Migrating: 2019_06_18_145622_create_todos_table
Migrated:  2019_06_18_145622_create_todos_table

Ở đây chúng ta thấy hệ thống có sẵn các file migration cho bảng users và bảng password_resets. Mở database ra chúng ta sẽ thấy trong database todos_app đã có bảng todos với một trường id duy nhất, do trong phương thức up() của file migration chúng ta chỉ tạo ra mỗi trường id.

Mục tiêu của chúng ta là tạo ra một bảng todos với các trường id, name, description và completed. Vậy để quay lại trạng thái ban đầu để có thể thay đổi trong file migration chúng ta thực hiện lệnh php artisan migrate:rollback

C:\laragon\www\todo-app
λ php artisan migrate:rollback
Rolling back: 2019_06_18_145622_create_todos_table
Rolled back:  2019_06_18_145622_create_todos_table
Rolling back: 2014_10_12_100000_create_password_resets_table
Rolled back:  2014_10_12_100000_create_password_resets_table
Rolling back: 2014_10_12_000000_create_users_table
Rolled back:  2014_10_12_000000_create_users_table

Kiểm tra lại database chúng ta thấy không còn các bảng todos, users, password_resets. Đây chính là cái hay của Laravel Migration. Chúng ta thực hiện tạo các trường cho bảng todos trong file migration create_todos_table như sau:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateTodosTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('todos', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->text('description');
            $table->boolean('completed');
            $table->timestamps();
        });
    }

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

Trong phương thức up() chúng ta đã định nghĩa thêm các trường sau:

  • name: tên công việc với kiểu dữ liệu là string tương ứng với VARCHAR.
  • description: mô tả công việc với kiểu dữ liệu là text tương ứng TEXT.
  • completed: trạng thái công việc với kiểu dữ liệu là boolean tương ứng với BOOLEAN hoặc TINY(1).

Cuối cùng trong phương thức up() gọi đến timestamp(), nó sẽ tạo ra hai trường là created_at và updated_at với kiểu dữ liệu là TIMESTAMP để quản lý thời gian tạo và cập nhật bản ghi.

Thực hiện lại câu lệnh php artisan migrate để tạo lại bảng todos.

Lời kết

Trong bài học hôm nay chúng ta đã được học cách thiết lập kết nối đến database, được làm quen với Laravel Migration để tạo bảng dữ liệu, tạo ra Model để tương tác với database, tuy nhiên mới chỉ dừng ở khâu tạo Model mà chưa sử dụng nó. Trong bài tiếp theo, bạn sẽ được tìm hiểu về cách sử dụng Laravel Model.

Code: Bài 5 - Thiết lập kết nối và tạo bảng trong database

Các bước thực hiện chạy ứng dụng:

  • Tải và giải nén file
  • Chạy composer update
  • Thực hiện câu lệnh php artisan migrate để tạo ra các bảng dữ liệu.
  • Chạy php artisan serve để có thể duyệt ứng dụng từ trình duyệt.

CÁC BÀI VIẾT KHÁC

FirebirD

Đam mê Toán học, Lập trình. Sở thích chia sẻ kiến thức, Phim hài, Bóng đá, Cà phê sáng với bạn bè.

Slack là gì? Tại sao slack phổ biến?

Todo List: Nhập dữ liệu mẫu với Factory và Seeding

3 Bình luận trong "Todo List: Thiết lập kết nối CSDL và tạo bảng với Laravel Migration"

  1. Nguyễn Đăng Quang

    2 months ago

    Phản hồi

    Phần code cho bài 5 bị thiếu rồi ad ơi, chưa có model Todo, chắc do chưa chạy lệnh ở phần Laravel model: php artisan make:model Todo. Phát hiện ra phần này vì bài 6 khi chạy Seeding dữ liệu mẫu bị lỗi.

  2. Lê Nguyên

    1 week ago

    Phản hồi

    Mình cũng chạy seeding bị lỗi, đã có php artisan make:model Todo rồi mà sao nó ko nhận (unable to locate)

    1. FirebirD

      1 week ago

      Phản hồi

      Lỗi này do hệ thống không xác định được vị trí của model sử dụng bạn thực hiện kiểm tra:

      1. Kiểm tra lại namespace của model Todo tạo ra
      2. Khi sử dụng model này bạn sử dụng namespace thế nào, có thể thử thay thế "App\Todo" thành "\App\Todo", tương tự như thay thế đường dẫn tương đối thành tuyệt đối, nếu như class seeding bạn để ở một chỗ khác không phải mặc định của Laravel.

      Chúc bạn may mắn.

Thêm bình luận