การเขียนคำสั่ง make:migration ใน Command บน Laravel

Migration เป็นไฟล์ข้อมูลที่เกี่ยวกับโครงสร้างตาราง ที่ไว้ใช้สร้างตารางลงฐานข้อมูลผ่าน Migrate บน Laravel หรือทำการเปลี่ยนแปลงของตารางในฐานข้อมูล ไม่ว่าจะเป็นการเพิ่มตารางใหม่, เพิ่มคอลัมน์ใหม่, แก้ไขชนิดของ Field และอื่นๆ โดยไม่ต้องแก้ไขคำสั่ง SQL โดยตรง 

ข้อดีของ Migration คือสามารถทราบและตรวจสอบประวัติการเปลี่ยนแปลงตารางใน  เมื่อต้องการยกเลิกการเปลี่ยนแปลงตาราง สามารถใช้คำสั่งย้อนกลับไปใช้ Migration ก่อนหน้านี้ตาม step ที่ต้องการได้

รูปแบบการเขียนคำสั่ง

php artisan migrate: install

เป็นคําสั่งที่ใช้เก็บประวัติข้อมูลชื่อตารางโดยผ่าน migrate ลงในฐานข้อมูล

รูปแบบการเขียนคำสั่ง

php artisan migrate

คำอธิบาย : เป็นคำสั่งที่ใช้ migrate ทุกครั้งหลังจากสร้างไฟล์ หรือแก้ไขตารางในฐานข้อมูล โดยจะมีการตอบ “yes” หรือ “no” เพื่อยืนยันหรือยกเลิกการ migrate

รูปแบบการเขียนคำสั่ง

php artisan migrate –force

คำอธิบาย : เป็นคำสั่งที่ใช้ migrate ทุกครั้งหลังจากสร้างไฟล์ หรือแก้ไขตารางในฐานข้อมูล โดยไม่ต้องมีการยืนยันจากผู้ใช้

ถ้าต้องการสร้างตารางที่เชื่อมโยงกับโมเดลที่กำลังสร้าง สามารถใช้ตัวเลือก –table เพื่อสร้างหรือแก้ไขตารางในฐานข้อมูล

รูปแบบการเขียนคำสั่ง

php artisan make:migration <ชื่อMigration> –table=<ชื่อตาราง>

ตัวอย่างคำสั่ง :  php artisan make:migration create_product_table –table=products

คำอธิบาย : สร้างไฟล์ Migration ที่มีชื่อว่า create_product_table พร้อมโค้ดสร้างตารางชื่อ products 

จากนั้นบันทึกไฟล์และใช้คำสั่ง php artisan migrate

ผลลัพธ์ : สร้างตารางใหม่ลงในฐานข้อมูลได้สำเร็จ

ตัวอย่างคำสั่ง :  php artisan make:migration add_price_to_products –table=products

คำอธิบาย : สร้างไฟล์ Migration เพื่อเพิ่มคอลัมน์ในตาราง products ที่มีอยู่ ในฐานข้อมูล  โดยตั้งชื่อ Migration ว่า add_price_to_products

จากนั้นบันทึกไฟล์และใช้คำสั่ง php artisan migrate เพื่ออัปเดตการแก้ไขตาราง products ในฐานข้อมูล

ผลลัพธ์ : เพิ่มคอลัมน์ในตารางลงในฐานข้อมูลได้สำเร็จ

ตรวจสอบฐานข้อมูล พบว่ามีการเพิ่มคอลัมน์ในฐานข้อมูลเรียบร้อย

หากต้องการแก้ไขชนิดคอลัมน์ในตาราง

ตัวอย่างคำสั่ง :  php artisan make:migration change_price_type_in_products –table=products

คำอธิบาย : สร้างไฟล์ Migration เพื่อแก้ไขชนิดของ Field เป็นชนิดข้อมูลที่ต้องการ ของตาราง products ที่มีอยู่

 ในฐานข้อมูล โดยตั้งชื่อ Migration ว่า change_price_type_in_products

ตัวอย่างเช่น: ให้ price มีจุดทศนิยม โดยสามารถใช้ชนิด float ดังภาพ

จากนั้นทำการบันทึกไฟล์และรัน Migration เพื่ออัปเดตตารางในฐานข้อมูล โดยใช้คำสั่ง php artisan migrate

ผลลัพธ์ : แก้ไขชนิดในตารางลงในฐานข้อมูลได้สำเร็จ

ตรวจสอบฐานข้อมูล พบว่ามีการแก้ไขชนิดคอลัมน์ในฐานข้อมูลเรียบร้อย

หากต้องการเพิ่ม foreign key สามารถทำตามขั้นตอนเช่นเดียวกับข้างบน

หากต้องการยกเลิกการทำงาน migration ก่อนหน้านั้น จะสามารถใช้คำสั่งได้หลายแบบดังนี้

รูปแบบการเขียนคำสั่ง

php artisan migrate:rollback

เป็นคำสั่งที่ใช้ยกเลิกการสร้างตารางเท่านั้น จะไม่มีผลต่อการแก้ไขชื่อคอลัมน์ ยกเลิกเพิ่มคอลัมน์ หรือเปลี่ยนแปลงชนิดคอลัมน์

ผลลัพธ์ : ตารางที่ถูกสร้างใน Migration ล่าสุดจะถูกลบออกจากฐานข้อมูล

ตัวอย่าง : หากมี Migration สองตัวที่สร้างตารางไว้ในฐานข้อมูล

เช่น ตัวแรกสร้างตาราง “products” และตัวที่สองสร้างตาราง “markets”.

เมื่อเราเรียกใช้คำสั่ง rollback จะย้อนกลับไปยัง Migration ล่าสุดที่เคยสร้างไว้

ดังนั้นตาราง “markets” จะถูกลบออกจากฐานข้อมูล ส่วนตาราง ” products” ยังคงอยู่ในฐานข้อมูล

หากต้องการตรวจสอบว่า ได้ลบตารางออกจากฐานข้อมูลแล้วหรือไม่ โดยสามารถใช้คำสั่ง php artisan migrate:rollback อีกครั้ง

จะเห็นว่า ไม่พบข้อมูลการสร้างตาราง markets แสดงว่าตารางนี้ถูกลบออกจากฐานข้อมูลเรียบร้อยแล้ว

หรือต้องการย้อนกลับการ migrate ตามจำนวนขั้นตอน ที่ต้องการลบ แต่ไม่นับไฟล์ Migration ที่เพิ่มคอลัมน์ แก้ไขชนิดคอลัมน์

รูปแบบการเขียนคำสั่ง

php artisan migrate:rollback –step=<จำนวนขั้นตอน>

ตัวอย่างคำสั่ง : php artisan migrate:rollback –step=1  

คำอธิบาย :  หากมี migrations ทั้งหมดอยู่ 10 step เมื่อใช้คำสั่งนี้ จะทำการย้อนกลับและลบ migration ล่าสุดออกจากฐานข้อมูล

ตัวอย่างคำสั่ง : php artisan migrate:rollback –step=5

คำอธิบาย :  หากมี migrations ทั้งหมดอยู่ 10 step เมื่อใช้คำสั่งนี้  จะทำการย้อนกลับและลบ migrations ที่ 6-10 ออกจากฐานข้อมูล โดยเรียงจากล่าสุดไปยังเก่าสุด

รูปแบบการเขียนคำสั่ง

php artisan migrate: reset

เป็นคำสั่งที่ใช้ยกเลิกการสร้างหรือแก้ไขตารางทั้งหมดที่เกี่ยวข้องกับ Migration ทั้งหมดที่เคยทำไว้ ในโปรเจค

ผลลัพธ์ : มีการลบตารางที่สร้างจาก Migration ทั้งหมดออกจากฐานข้อมูล

รูปแบบการเขียนคำสั่ง

php artisan migrate:fresh

เป็นคําสั่งที่ใช้ลบตารางทั้งหมด และสั่ง migrate ใหม่อีกครั้ง

รูปแบบการเขียนคำสั่ง

php artisan migrate: refresh

เป็นคำสั่งย้อนกลับไปยัง migration ที่เคยทำไว้ทั้งหมดก่อนหน้านี้และทำการสร้างหรือแก้ไขตารางใหม่ run migrate ใหม่อีกครั้ง

รูปแบบการเขียนคำสั่ง

php artisan migrate:refresh –path =”database/migrations/<ชื่อไฟล์Migration>”

หากต้องการใช้คำสั่ง php artisan migrate:refresh เฉพาะกับตารางบางตัวเท่านั้น  โดยไม่กระทบต่อ Migration อื่น ๆ ในโปรเจค

จะสามารถใช้ –path เพื่อระบุเส้นทางของ Migration ที่ต้องการรีเฟรชได้

ตัวอย่างคำสั่ง :

php artisan migrate:refresh –path=”database/migrations/2023_22_07_170539_create_product_table.php”

หรือหากต้องการเพิ่มคอลัมน์ หรือแก้ไขชนิดคอลัมน์ ในตาราง Product เดิม ในไฟล์ migration เดิม  ก็สามารถทำการรีเฟรชเฉพาะ migration ที่ต้องการได้  แต่วิธีดีที่สุดคือทำการสร้าง migration ใหม่ เพื่อเพิ่มคอลัมน์หรือแก้ไขชนิดในตาราง และทำการรีเฟรชเฉพาะ migration ที่ถูกสร้างใหม่ ได้ เพื่อไม่เกิดปัญหา Error ในเมื่อต้องการรัน Migrate กับตารางที่มี Foreign Key ที่เชื่อมโยงกันระหว่างตารางในฐานข้อมูล

ตัวอย่างคำสั่ง :

php artisan migrate:refresh –path=”database/migrations/2023_23_07_035248_change_price_type_in_ products_table.php “

หากยังมี Foreign Key ให้ลบออกจากตารางที่เกี่ยวข้องก่อนที่จะรันคำสั่ง php artisan migrate:refresh ใหม่ได้

 โดยทำตามขั้นตอนดังนี้

  1. สร้างไฟล์ Migration ที่ใช้ในการลบ Foreign Key ออกจากตาราง

ตัวอย่างคำสั่ง : php artisan make:migration drop_foreign_keys

  • เปิดไฟล์ Migration ที่คุณสร้างขึ้น (drop_foreign_keys) และเพิ่มคำสั่งภายในเมธอด up() เพื่อลบ Foreign Key ที่ต้องการออกจากตารางที่เกี่ยวข้อง ตัวอย่างเช่น:

รูปแบบการเขียนคำสั่ง:

หรือ อีกวิธีใช้ลบ Foreign Key ของตารางที่เกี่ยวข้อง ในฐานข้อมูลโดยตรง แต่ไม่แนะนำ เนื่องจากจะทำให้ทีมพัฒนา

เกิดความสับสนของโครงสร้างตาราง

ข้อควรระวัง คำสั่งทั้ง Rollback , Reset, Fresh, Refresh จะลบตารางที่มีอยู่ในฐานข้อมูลได้ ดังนั้นควรใช้ในระหว่างการพัฒนาและทดสอบระบบเท่านั้น หากมีข้อมูลสำคัญ ให้ทำการสำรองข้อมูลก่อนเสมอ

ผู้เขียน

Sinnapa Prasith-Rathsint
sinnapa@g.swu.ac.th