การสร้าง Scope บน Model เพื่อใช้งานเงื่อนไข Query ซ้ำ ใน Laravel

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 ไม่ตรงกัน

ผู้เขียน