Eloquent Model ตอนที่ 1

Founder, MyCoding.Academy
วิศวกรไฟฟ้าและโทรคมนาที่หลงไหลการเขียนโปรแกรม เลยได้ทำงานประจำช่วงหนึ่งทางด้านการพัฒนาซอฟต์แวร์ ปัจจุบันก็ยังทำงานเป็นฟรีแลนซ์ทางด้านการเขียนโปรแกรมอยู่นะครับ

Eloquent Model หรือต่อไปนี้จะเรียกว่า โมเดล เป็นส่วนที่ทำหน้าที่ติดต่อกับฐานข้อมูล (เป็นส่วนใหญ่) และเป็นส่วนประกอบสำคัญสำหรับสถาปัตยกรรมแบบ Model-View-Controller (MVC) ที่เป็น Design Pattern ที่นิยมใช้กันใน Web Application ต่างๆ ไม่เฉพาะ Laravel นะครับ สำหรับในบทความนี้เราจะมาทำความเข้าใจกับตัวโมเดลใน Laravel กันครับ

ก่อนที่เข้าสู่รายละเอียดของ Eloquent Model เรามาทำความเข้าใจกับ MVC Design Pattern กันก่อนนะครับรายละเอียดคร่าวตามรูปด้านล่างเลยครับ อย่างง่ายๆ คือเมื่อผู้ใช้งานส่ง URL ผ่าน browser มา ตัว Laravel Application จะทำการตรวจสอบว่า Route ที่ส่งมาต้องใช้ Controller ตัวใดและ method ใดจของ Controller หลังจากนั้นก็จะทำการเรียกใช้งานซึ่งในบาง Controller method ก็อาจจจะเรียก View มาเพื่อทำการแสดงผลอย่างเดียว หรืออาจจะสร้าง Model ดึงข้อมูล แล้วส่งต่อข้อมูลที่ได้ให้ View นำไปแสดงผลอีกทีครับ  

MVC Design Pattern

ดังนั้นในการเขียนโปรแกรมแบบ MVC ที่ View จะรับผิดชอบการแสดงผลอย่างเดียว ไม่มีการ Query ฐานข้อมูล เพราะเป็นหน้าที่ของ Model ตัว Controller จะมีหน้าที่ในการตัดสินใจตาม Business Logic ว่าจะทำการเลือกใช้ Model ใด และเรียกใช้อย่างไรด้วย 

เราจะเห็นจากรูปนะครับว่า Model จะถูกเรียกจาก Controller แต่ตัว Model ไม่ได้ผูกติดกับ Controller เลย คือมีหรือไม่มี Controller ก็ไม่เกี่ยวข้องกับการทำงานของ Model แต่กลับกันฐานข้อมูลเป็นสิ่งคู่กันกับ Model เลยครับ

การตั้งชื่อ Model และการสร้างไฟล์

สำหรับตำแหน่งที่เก็บไฟล์ของโมเดลอยู่ที่ app\Models\ ครับ โดยเราจะตั้งชื่อ Class เป็นชื่อเดียวกับชื่อไฟล์ เช่น User.php ก็จะมี class User { ... } โดยชื่อจะเป็นแบบ Singular หรือชื่อเดี่ยว โดยตัว Laravel จะมองหาตารางฐานข้อมูลชือ users อัตโนมัติเลย หมายถึงตารางในฐานข้อมูลชื่อจะเป็นแบบ Plural ครับ ทำให้เราไม่ต้องกำหนด property $table ถ้าเราใช้รูปแบบแบบนี้

สำหรับการสร้างไฟล์โมเดลนั้น ก็เช่นเดียวกับไฟล์อื่นๆ เราจะใช้คำสั่ง Artisan แทนการทำเอง เนื่องจากมันเร็ว และมีรูปแบบที่ดีกว่าสำหรับการสร้างโมเดลง่ายๆ คือ

php artisan make:model [options] [--] <name>

โดย options นั้นมีเยอะมากครับ จะขึ้นต้นด้วย - เป็นส่วนใหญ่ บางตัวเลือก (option) ก็ขึ้นต้นด้วย -- เราสามารถสร้าง Controller ที่จะเรียกใช้งานตัวโมเดลได้พร้อมกัน รวมถึงไฟล์ migration ที่ใช้ในการสร้างตารางในฐานข้อมูลด้วย ในที่นี่ผมจะพูดถึงบางตัวเลือกที่น่าสนใจเท่านั้นนะครับ

-m หรือ --migration จะใช้สำหรับการสร้างไฟล์ migration เพื่อใช้สร้างตารางใหม่สำหรับโมเดลในฐานข้อมูล

-rc ใช้สร้าง resource controller ซึ่งจะมี method ที่มีรูปแบบเป็นมาตรฐานที่ใช้กันทั่วไป เช่น create, update, store, destroy เป็นต้น

สองตัวนี้จะใช้บ่อยที่สุดครับ นอกจากนี้มันยังสามารถสร้าง Request, Policy class ที่จะใช้งานร่วมกับโมเดล สร้างไฟล์สำหรับการทดสอบโมเดล และไฟล์ seeder และ factory ที่ใช้ในการใส่ข้อมูลเริ่มต้นเพื่อใช้งาน และใช้สำหรับการทดสอบตามลำดับ

จะเห็นว่ากรณีใช้ option ที่เริ่มต้นด้วย - เราสามารถนำมารวมกันได้เลยนะครับ ลองดูภาพต่อไปนะครับ

artisan make model example

จากรูปนะครับ ครั้งแรกสร้างไฟล์โมเดล พร้อมกับ resource controller ส่วนครั้งที่สองสร้างแบบเดิมแต่เราเพิ่ม migration ด้วยพร้อมระบุด้วยว่าให้สร้างทับไฟล์เดิมเลยด้วย --force ก็จะได้ผลตามรูปเลยครับในกรณีนี้ไฟล์ controller จะยังคงอยู่ไม่มีการแก้ไขอะไร

สำหรับคลาสโมเดลของเราก็จะสืบทอดมาจาก Illuminate\Database\Eloquent\Model ก็จะได้คุณสมบัติต่างๆ มากคลาสนี้ครับ ดูรูปต่อไปคือผลจากการใช้คำสั่งที่สองจากรูปที่แล้วครับ

make:model result

สำหรับไฟล์ที่ได้มาเหล่านี้เราก็ต้องทำการแก้ไข ให้ตรงกับความต้องการของเราต่อไปนะครับ ยังไม่พร้อมใช้งาน โดยเฉพาะ Migration เพราะยังมีแค่ฟิลด์ id, created_at, updated_at แค่นั้น เราต้องเพิ่มฟิลด์กันอีกที แต่อยากให้เข้าใจภาพรวมก่อนเป็นสิ่งแรกครับ

สำหรับชื่อตารางที่ใช้เก็บข้อมูล เราไม่ได้กำหนดอะไรเลยนะครับ เนื่องจาก Laravel จะใช้ชื่อโมเดลไปตั้งชื่อตารางอีกที โดยจะแยกตัวคำที่ขึ้นต้นด้วยอักษรภาษาอังกฤษตัวใหญ่แล้วแทรก _ เข้าไปอีกที

php artisan make:model -m StudentAssignment

เราจะได้ไฟล์ app\Models\StudentAssignment.ph และ migrations\YYYY_MM_DD_HHmmss_create_student_assignments_table.php โดยตารางที่ได้คือ student_assignments ครับ

ซึ่งถ้าเราไม่ต้องการชื่อแบบนี้ ก็สามารถไปกำหนด property ชื่อ table ในโมเดลได้อีกทีครับ เช่น

protected $table = 'student_assignment';

สำหรับบทความนี้ ก็ขอพักกันไว้แค่นี้ก่อนครับ ไม่อยากให้ยาวมาก เดี๋ยวจะน่าเบื่อเกินไป สวัสดีครับ