Mutators และ Accessors ใน Laravel เป็นฟีเจอร์ที่ช่วยให้เราสามารถกำหนดรูปแบบข้อมูลที่ต้องการเก็บลงฐานข้อมูล (Mutator) และรูปแบบข้อมูลที่ต้องการดึงขึ้นมาแสดงผล (Accessor) ได้สะดวก โดยสามารถปรับแต่งค่าให้เป็นไปตามที่ต้องการโดยไม่จำเป็นต้องแก้ไขข้อมูลดิบในฐานข้อมูล
- Mutator: ใช้สำหรับปรับแต่งข้อมูลก่อนที่จะถูกบันทึกลงในฐานข้อมูล
- Accessor: ใช้สำหรับปรับแต่งข้อมูลก่อนที่จะถูกดึงขึ้นมาแสดงผล
การสร้าง Mutators และ Accessors
Laravel จะใช้วิธีการสร้างฟังก์ชันใน Model โดยตั้งชื่อตามรูปแบบ setAttributeNameAttribute
สำหรับ Mutator และ getAttributeNameAttribute
สำหรับ Accessor
ตัวอย่างการใช้งาน Mutator และ Accessor
สมมติว่าเรามี Model ชื่อ User
และต้องการใช้ Mutator และ Accessor สำหรับฟิลด์ name
และ email
- การสร้าง Mutator
ตัวอย่าง Mutator ที่แปลงค่า name
ให้เป็นตัวอักษรพิมพ์ใหญ่ก่อนบันทึกลงฐานข้อมูล
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
public function setNameAttribute($value)
{
$this->attributes['name'] = strtoupper($value);
}
}
ในตัวอย่างนี้ ฟังก์ชัน setNameAttribute
จะถูกเรียกทุกครั้งที่มีการกำหนดค่า $user->name
และค่าที่ได้รับ ($value
) จะถูกแปลงเป็นตัวพิมพ์ใหญ่ก่อนบันทึกลงในฐานข้อมูล
$user = new User;
$user->name = 'john doe'; // ค่า name จะถูกแปลงเป็น 'JOHN DOE'
$user->save();
2. การสร้าง Accessor
ตัวอย่าง Accessor ที่แปลงค่า email
ให้เป็นตัวอักษรพิมพ์เล็กทุกครั้งที่เรียกใช้
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
public function getEmailAttribute($value)
{
return strtolower($value);
}
}
ในตัวอย่างนี้ ฟังก์ชัน getEmailAttribute
จะถูกเรียกทุกครั้งที่มีการเรียกใช้ $user->email
และจะแปลงค่าของ email
เป็นตัวพิมพ์เล็กก่อนแสดงผล
$user = User::find(1);
echo $user->email; // แสดงค่า email ในรูปแบบตัวพิมพ์เล็ก
การใช้งานร่วมกันระหว่าง Mutators และ Accessors
Mutator และ Accessor สามารถใช้งานร่วมกันเพื่อควบคุมข้อมูลได้อย่างมีประสิทธิภาพ ตัวอย่างเช่น:
- ใช้ Mutator แปลงชื่อให้เป็นตัวพิมพ์ใหญ่ก่อนบันทึก
- ใช้ Accessor แสดงชื่อที่มีการปรับแต่งเพิ่มเติมก่อนแสดงผล
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
public function setNameAttribute($value)
{
$this->attributes['name'] = strtoupper($value);
}
public function getNameAttribute($value)
{
return "Mr./Ms. " . ucfirst($value);
}
}
Mutator: เปลี่ยนชื่อให้เป็นตัวพิมพ์ใหญ่ เช่น john doe
จะถูกบันทึกเป็น JOHN DOE
Accessor: เพิ่ม “Mr./Ms.” ที่หน้า name
เช่น JOHN DOE
จะแสดงผลเป็น Mr./Ms. John doe
การนำไปใช้งาน
Mutators และ Accessors ช่วยให้เราสามารถจัดการข้อมูลใน Model ได้อย่างยืดหยุ่น สามารถควบคุมรูปแบบการบันทึกและแสดงผลข้อมูลได้ตามต้องการ โดยไม่ต้องทำการแปลงข้อมูลทุกครั้งที่เรียกใช้งาน ช่วยให้โค้ดมีความกระชับและง่ายต่อการบำรุงรักษา