10 ความสามารถของ Eloquent ที่คุณอาจยังไม่รู้

สาวก Laravel ที่เฝ้าติดตามใช้ Framework นี้มาตั้งแต่ 4.2 อย่างผมคงไม่อาจบอกได้ว่ารู้ทุกสิ่งสรรพในตัว Framework ตัวนี้ได้ เพราะในแต่ละเวอร์ชันที่ออกมาอยู่เรื่อยๆ มีการเปลี่ยนแปลง ยุบ Method และ Features หลายๆ ส่วนออกไปจากตัวมันเอง ด้วยเหตุผลหลายๆ อย่าง ไม่แปลกเลยที่คุณจะไม่รู้ หรือแม้แต่จำไม่ได้ว่ามันเคยมี หรือมันทำได้ บวกกับ Document ของ Laravel ที่ไม่ค่อยจะมี Example ให้เราดูมากนัก สำหรับบาง section ทำให้ค่อนข้างที่เข้าใจยากในระดับหนึ่งเลยล่ะ

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


เอาล่ะมาดูกันว่าความสามารถของ Eloquent มีอะไรบ้าง?

1. สามารถกำหนด Column ของ timestamp ได้

โดยปกติแล้ว Models ของ Laravel นั้นจะใช้ created_at และ updated_at ในการเก็บข้อมูลวันที่สร้าง และเปลี่ยนแปลงข้อมูล รวมไปถึงการทำ Soft Delete ที่ใช้ deleted_at ในการเช็คว่า record ถูกลบไปหรือยัง? แต่สำหรับใครหลายๆ คนที่ไม่ไช่ สาวก Laravel อาจจะไม่ชอบใจ หรือไม่เข้าใจว่าทำไมต้องใช้คำเหล่านี้ ถ้าอยากเปลี่ยนละทำได้มั้ย? ถ้าอยากใช้ sent_at แทนล่ะ? คำตอบคือทำได้ครับ

class User extends Model
{
const CREATED_AT = 'created';
const UPDATED_AT = 'last_update';
const DELETED_AT = 'removed';
}

2. Exists?

ไช่แล้ว มีหรือยัง? มีมั้ย? มีสิ โดยปกติ ถ้าเราต้องการเช็คว่ามี record นี้ในฐานข้อมูลมั้ย? เราอาจจะต้องเขียนเพิ่มมา 1 บรรทัด เพื่อหาว่ามี record นี้แล้วหรือยัง ซึ่งเราสามารถใช้ exists() แทนได้นะเออ มีข้อแม้ว่าแค่เอามาหาเฉยๆ ถ้ามีเงื่อนไขอื่นๆ ที่ซับซ้อนกว่านี้ก็ต้องใส่เพิ่มไป

$user = new User;
$user->name = 'George';
$user->email = 'george@example.com';
$user->password = 'secret';
$user->exists; // false
$user->save();
$user->exists; // true

3. Dirty

อันนี้ผมก็เพิ่งรู้ว่ามีนะ (ฮา) เป็นคุณสมบัติที่เอาไว้มาเช็คว่าข้อมูลที่ดึงมาจาก Model นั้นมีการเปลี่ยนแปลงค่าหรือเปล่า? เราสามารถใช้ isDirty ในการเช็คได้ หากมี Attribute ตัวไหนก็แล้วแต่เปลี่ยนแปลงค่าไป มันจะ return true มาให้ และยังสามารถใช้งาน getDirty เพื่อดูว่า Attribute ไหนที่ถูกแก้ไขข้อมูล โอ้ว คือดีย์อ่ะ

$user = User::first();
$user->isDirty(); // false
$user->name = 'James';
$user->isDirty(); // true
$user->isDirty('email'); // false
$user->isDirty('name'); // true
$user->getDirty(); // ["name" => "James"]

4. Original

สำหรับตัวนี้เป็นความสามารถที่มีมานานแล้ว น่าจะตั้งแต่ 5.1 หลักๆ คือเอาไว้ดูข้อมูลดิบๆ ที่ส่งมาจาก Database เลย เพราะว่าในบางครั้งเราอาจจะเขียน Override ค่า Attribute แล้วเกิดอยากจะดูข้อมูลดิบก่อนถูกแปลงค่ามา

$user = User::first();
$user->name = 'James';

$user->getOriginal(); // Array with "name" => "George"
$user->getOriginal('name'); // "George"

5. Cloning

สำหรับตัวนี้เป็นความสามารถที่มีมานานแล้ว น่าจะตั้งแต่ 5.1 หลักๆ คือเอาไว้ดูข้อมูลดิบๆ ที่ส่งมาจาก Database เลย เพราะว่าในบางครั้งเราอาจจะเขียน Override ค่า Attribute แล้วเกิดอยากจะดูข้อมูลดิบก่อนถูกแปลงค่ามา

$user = User::first();
$clonedUser = $user->replicate();

6. Convert Model หรือ Collection ให้เป็น Array

หลายๆ คนที่ใช้ Laravel มาซักระยะ อาจจะคุ้นเคยกับ toArray ที่มีความสามารถในการ convert Model หรือ Collect ที่มีรูปแบบเป็น Object ให้กลายเป็น Array ได้

// Convert model instance เป็น array
$user = User::first();
$user->toArray();
// Convert collection เป็น array
$users = User::all();
$users->toArray();

7. Refresh

ไช่แล้ว Reset cooldown skill บ๊ะ ไม่ไช่สิ Reset ค่าของ Model ที่ถูกแก้ไขให้กลับไปเป็นค่าเดิมที่ดึงมากจาก database รวมไปถึงข้อมูลอื่นๆ ที่เป็น relation ด้วย

$user= User::where('name', 'George')->first();
$user->name= 'James';
$user->address->city = "New York";
$user->refresh();
$user->name; // "George"
$user->address->city; // "Washington"

8. Without events

ความสามารถหนึ่งที่ผมไม่เคยได้ใช้เป็นจริงเป็นจัง ของ Laravel นั่นก็คือ Event เป็นความสามารถในการผูก Event กัน หรือที่เรียกง่ายๆ ว่า Callback

/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
'App\Events\UserCreated' => [
'App\Listeners\SendWelcomeNotification',
],
];

ยกตัวอย่าง เช่น การส่งอีเมลหลังจากสร้างบัญชีผู้ใช้งาน โดยที่เราไม่ต้องเขียนลงลงใน Controller และสามารถผูก Event นี้ได้ตลอด เมื่อไหร่ก็ตามที่ เกิด Event สร้างบัญชีผู้ใช้ โดยที่เราไม่ต้องไปเขียน Code ส่งเมลตามหลังตลอด และไช่แล้ว! บางครั้งเราก็ไม่อยากส่งอีเมลหลังจากการสร้างบัญชี เช่นในระบบจัดการผู้ใช้ใน CMS ของเรา ก็เลยปเ็นที่มาของความสามารถนี้ ร่ายยาวมาก (ฮา)

$user = User::withoutEvents(function () {
return factory(User::class)->create();
});

9. Push

ความสามารถนี้ต่างจาก save() ตรงที่ ถ้าเราไม่ได้ select มา ข้อมูลที่แก้ไขก็จะไม่นำไปบันทึกซึ่งต่างจาก push() ที่บันทึกให้ทุกกรณี ตามตัวอย่างเลยครับ

$user = User::where('name', 'George')->first();
$user->age = 42;
$user->address->city = "New York";
$user->save(); // ข้อมูล age กับ city จะไม่ถูกบันทึกลง database
$user->push(); // แบบนี้ได้ :)

10. การใช้ Hard Delete ในโหมด Soft Delete

ในบางเหตุการณ์ เราอาจจะมีความจำเป็นต้องลบข้อมูลออกไปจาก Database เลย แต่ติดว่าเราทำ Soft Delete ซึ่งถ้าต้องการจะลบก็อาจจะต้องข้าไปลบใน Database เลยตรงๆ โอเค Laravel ได้เตรียม forceDelete ในกรณีนี้

$user = User::first();
$user->forceDelete();

บทส่งท้าย

เนื่องจากบทความนี้ผมไม่ได้เขียนเอง แต่เป็นการเอาบทความมาแปลต่ออีกที เพราะเห็นว่ามันดี และน่าสนใจ และก็อยากจะแชร์เผื่อจะเป็นประโยชน์กับคนอื่นๆ ยังไงก็ต้องขอบคุณเจ้าของบทความด้วยที่เขียนบทความดีๆ แบบนี้มาให้เราได้อ่านกัน ส่งท้ายนี้ก็ ติชมกันได้ผ่านคอมเมนต์ด้านล่างครับ :)