มาถึงส่วนสำคัญของการพัฒนาโปรแกรม คือการเชื่อมโยงฐานข้อมูล เพื่อเพิ่ม อ่าน แก้ไข ลบ หรือที่เรียกว่า 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
ซึ่งเป็นเหมือนไฟล์คอนฟิกของ Laravel เพื่อกำหนดค่าตัวแปรต่างๆ เช่นค่าคอนฟิกในการเชื่อมโยงฐานข้อมูล
ตัวอย่างการแก้ไขค่าตัวแปรสำหรับการเชื่อมโยงฐานข้อมูลในไฟล์ .env
...
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=blog
DB_USERNAME=blog
DB_PASSWORD=secret
...
คำอธิบาย
สมมติว่าเราต้องการเก็บข้อมูลบทความ ขอตั้งชื่อตารางในฐานข้อมูลที่เก็บว่า 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
เป็นไฟล์คลาส Modeldatabase/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
กัน