Laravel 7 : การสร้าง Model และไฟล์ migration

มาถึงส่วนสำคัญของการพัฒนาโปรแกรม คือการเชื่อมโยงฐานข้อมูล เพื่อเพิ่ม อ่าน แก้ไข ลบ หรือที่เรียกว่า CRUD (Create, Read, Update and Delete ) ข้อมูลที่ต้องการได้

สำหรับการพัฒนาโปรแกรมในรูปแบบ MVC จะถูกกำหนดเป็นส่วนของ Model เพื่อใช้เชื่อมโยงกับฐานข้อมูล เริ่มต้นมาดูวิธีการสร้าง Model และไฟล์ migration เพื่อเชื่อมโยงตารางฐานข้อมูล ใน Laravel กัน

Laravel รองรับฐานข้อมูลทั้ง MySQL, PostgreSQL, SQLite, SQL Server โดยวิธีการเชื่อมโยงจะเรียกผ่านคลาส เมธอด รูปแบบเดียวกัน ทำให้ถ้าต้องการเปลี่ยนฐานข้อมูล จะสามารถย้ายจากฐานข้อมูลหนึ่ง ไปยังฐานข้อมูลอื่นๆ ได้โดยง่าย เปลี่ยนแค่ไฟล์คอนฟิกเท่านั้น

ในที่นี้ขอทดสอบกับ MySQL

สร้างฐานข้อมูล

ก่อนอื่นเราจะสร้างฐานข้อมูลใน MySQL ชื่อ blog

ตัวอย่างคำสั่ง mysql เพื่อสร้างฐานข้อมูล blog และกำหนดสิทธิ์ให้ผู้ใช้งาน blog ด้วยรหัสผ่าน secret

mysql> CREATE DATABASE blog;

mysql> CREATE USER 'blog'@'localhost' IDENTIFIED BY 'secret';

mysql> GRANT ALL PRIVILEGES ON blog.* TO 'blog'@'localhost';

แก้ไขไฟล์คอนฟิก .env

ลำดับถัดไป แก้ไขไฟล์ .env ซึ่งเป็นเหมือนไฟล์คอนฟิกของ Laravel เพื่อกำหนดค่าตัวแปรต่างๆ เช่นค่าคอนฟิกในการเชื่อมโยงฐานข้อมูล

ตัวอย่างการแก้ไขค่าตัวแปรสำหรับการเชื่อมโยงฐานข้อมูลในไฟล์ .env

...
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=blog
DB_USERNAME=blog
DB_PASSWORD=secret
...

คำอธิบาย

  • DB_CONNNECTION ระบุชนิดฐานข้อมูล ในที่นี้เราใช้ mysql สำหรับฐานข้อมูลอื่นๆ สามารถระบุเป็น sqlite, pgsql, sqlsrv
  • DB_HOST ระบุ IP ของเซิร์ฟเวอร์ฐานข้อมูล ในที่นี้เป็น 127.0.0.1 หรือ localhost จะเป็นเครื่องเดียวกับที่เรารัน Laravel
  • DB_PORT ระบุพอร์ตของเซิร์ฟเวอร์ฐานข้อมูล
  • DB_DATABSE ระบุชื่อฐานข้อมูล
  • DB_USERNAME ระบุชื่อผู้ใช้งานที่มีสิทธิ์เข้าฐานข้อมูล
  • DB_PASSWORD ระบุรหัสผ่าน

สร้าง Model และไฟล์ migration

สมมติว่าเราต้องการเก็บข้อมูลบทความ ขอตั้งชื่อตารางในฐานข้อมูลที่เก็บว่า articles โดยมีชื่อฟิลด์ title เพื่อเก็บหัวข้อ และ body เพื่อเก็บเนื้อหาในบทความ

แทนที่เราต้องไปสร้างตารางในฐานข้อมูลก่อน ใน Laravel เราสามารถสร้าง Model เพื่อเชื่อมโยงกับตาราง articles พร้อมสร้างไฟล์ migration เพื่อกำหนดโครงสร้างตารางฐานข้อมูลในรูปแบบไฟล์คลาส PHP ได้เลย

มาตรฐานของ Laravel ในการตั้งชื่อ Model เพื่อเชื่อมโยงตารางข้อมูล จะใช้รูปเอกพจน์ (singular) ของชื่อตารางที่เราต้องการเก็บในฐานข้อมูล และเปลี่ยนชื่อตัวอักษรตัวแรกของแต่ละพยางค์เป็นตัวพิมพ์ใหญ่ (capitalize) ตัวอย่างเช่น ถ้าเราตั้งชื่อตาราง articles ชื่อ Model ในการเชื่อมโยงกับตารางนี้ใน Laravel ก็จะเป็น Article

รันคำสั่ง php artisan make:model เพื่อสร้าง Model ชื่อ Article พร้อมระบุออปชัน -m เพื่อสร้างไฟล์ migration สำหรับกำหนดโครงสร้างตารางของ Model นี้ โดยอัตโนมัติ

$ php artisan make:model -m Article
Model created successfully.
Created Migration: 2020_04_05_023514_create_articles_table

ผลลัพธ์ที่ได้จากการรันคำสั่ง จะมีไฟล์ถูกสร้างขึ้นสองไฟล์ คือ

  • app/Article.php เป็นไฟล์คลาส Model
  • database/migrations/2020_04_05_023514_create_articles_table.php เป็นไฟล์ migration สำหรับกำหนดโครงสร้างตาราง

หมายเหตุ 2020_04_05_023514 เป็น ปี เดือน วัน เวลา ที่รันคำสั่ง

มาดูตัวอย่างไฟล์คลาส Model ที่ถูกสร้างขึ้น สำหรับการใช้งานเบื้องต้น ไม่ต้องแก้ไขอะไรในไฟล์นี้

// app/Article.php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
    //
}

ตัวอย่างไฟล์ migration ที่ถูกสร้างขึ้น ซึ่งเราจะใช้กำหนดโครงสร้างตาราง articles

// database/migrations/2020_04_05_023514_create_articles_table.php

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

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

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

วิธีการกำหนดโครงสร้างของตาราง articles ทำได้โดย แก้ไขเมธอด up() ภายใต้การเรียกเมธอด Schema::create()

จากการรันคำสั่ง make:model พร้อมระบุออปชัน -m เพื่อสร้างไฟล์ migration จะมีการกำหนดโครงสร้างตารางอยู่สองบรรทัด

Schema คำอธิบาย MySQL Data Type
$table->id() สร้างฟิลด์ Primary Key BIGINT UNSIGNED, AUTO_INCREMENT
$table->timestamps() สร้างฟิลด์ created_at เก็บเวลาที่สร้างข้อมูล และ updated_at เก็บเวลาแก้ไข TIMESTAMP

ถ้าเราต้องการกำหนดฟิลด์เพิ่มเติมเช่น title กับ body ก็สามารถทำได้โดย เพิ่มบรรทัดคำสั่งภายใน Schema::create()

// database/migrations/2020_04_05_023514_create_articles_table.php

// ...
class CreateArticlesTable extends Migration
{
    public function up()
    {
        Schema::create('articles', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->text('body');
            $table->timestamps();
        });
    }

    //...

คำอธิบาย

Schema คำอธิบาย MySQL Data Type
$table->string('title') ฟิลด์ชื่อ title เก็บหัวข้อบทความ VARCHAR(255)
$table->text('body') ฟิลด์ชื่อ body เก็บเนื้อหาในบทความ TEXT

หลังจากกำหนดโครงสร้างตารางในไฟล์ migration เรียบร้อยแล้ว รันคำสั่ง php artisan migrate เพื่อสร้างตารางในฐานข้อมูล

ตัวอย่างการรันคำสั่ง php artisan migrate

$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.02 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.01 seconds)
Migrating: 2020_04_05_023514_create_articles_table
Migrated:  2020_04_05_023514_create_articles_table (0.01 seconds)

จริงๆ แล้วมีไฟล์ migration อื่นๆ ที่มาเป็นดีฟอลต์จากการติดตั้ง Laravel ในเบื้องต้นขออนุญาตอธิบายเฉพาะไฟล์ migration ของ articles

หลังจากรันคำสั่ง migrate ถ้าเข้าไปดูในฐานข้อมูลเช่นในที่นี้ดูด้วยคำสั่ง mysql จะมีตาราง articles ถูกสร้างขึ้นมาโดยอัตโมมัติ ตามชื่อไฟล์และชนิดที่กำหนดในไฟล์ migration

mysql> DESCRIBE articles;
+------------+---------------------+------+-----+---------+----------------+
| Field      | Type                | Null | Key | Default | Extra          |
+------------+---------------------+------+-----+---------+----------------+
| id         | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| title      | varchar(255)        | NO   |     | NULL    |                |
| body       | text                | NO   |     | NULL    |                |
| created_at | timestamp           | YES  |     | NULL    |                |
| updated_at | timestamp           | YES  |     | NULL    |                |
+------------+---------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

ในตอนต่อไป มาดูวิธีการเรียกใช้งานคลาส Article ที่เป็น Model เพื่อเชื่อมโยงตาราง articles กัน

ข้อมูลเพิ่มเติม

Laravel Migration File