Scope คือการกำหนดเงื่อนไข Query กลางไว้ภายใน Model เพื่อให้สามารถเรียกใช้งานซ้ำได้หลายส่วนของระบบ ช่วยลดการเขียน Query เดิมซ้ำ ๆ ทำให้โค้ดอ่านง่าย และดูแลรักษาได้สะดวกมากขึ้น
ตัวอย่างที่ 1
สมมติในระบบมีการแสดงเฉพาะผู้ใช้งานที่ยังใช้งานอยู่
สถานะในฐานข้อมูล
status
1 = ใช้งาน
0 = ยกเลิก
หลายหน้าในระบบ เขียน (‘status’, 1) ซ้ำ เช่น
หน้า A
Student::where(‘status’, 1)->get();
หน้า B
Student::where(‘status’, 1) ->orderBy(‘firstname’) ->get();
ปัญหาดังกล่าว เราจะสามารถแก้ไขโดยลดการเขียนซ้ำด้วยการสร้าง Scope ใน Model
ตามรูปแบบ
scope{ชื่อเงื่อนไข}($query)
Laravel จะตัดคำว่า scope ออกอัตโนมัติ ทำให้สามารถเรียกใช้งานผ่าน active() ได้
เช่น
ภายในไฟล์ app/Models/User.php
public function scopeActive($query)
{
return $query->where('status', 1);
}
วิธีการเรียกใช้งาน
Student::where('status', 1)->get();
เขียนเป็น Student::active()->get();
Student::where('status', 1)->orderBy('firstname') ->get();
เขียนเป็น Student::active()->orderBy('firstname')->get();
ตัวอย่างที่ 2
การสร้าง Scope สำหรับเงื่อนไข Query ที่ใช้งานซ้ำและรองรับ Parameter
รูปแบบการเขียนฟังก์ชัน
scope{ชื่อฟังก์ชัน}($query, {ชื่อparameter})
เช่น ค้นหาตามปี
public function scopeYear($query, $year)
{
return $query->whereYear('created_at', $year);
}
การเรียกใช้งาน
Example::year($request->year)->get();
ข้อที่ควรรู้
1. ชื่อ Scope ต้องขึ้นต้นด้วยคำว่า scope
2. เมื่อนำไปเรียกใช้งาน Laravel จะตัดคำว่า scope ออกอัตโนมัติ
3. Scope สามารถรับ Parameter ได้มากกว่า 1 ตัว
4. สามารถนำ Scope หลายตัวมาต่อกันได้
ข้อดีของการใช้ scope
1. ลดการเขียน Query ซ้ำ
2. แก้ไขง่าย หากต้องเปลี่ยนเงื่อนไข แก้ที่ Model เพียงจุดเดียว
3. ทุกหน้าจะใช้เงื่อนไขเดียวกัน ลดความผิดพลาดจากการเขียน Query ไม่ตรงกัน