لاراول: چگونگی استفاده از Accessors و mutators

آیا تاکنون مجبور شده اید قبل از ذخیره کردن داده ها در دیتابیس تغییری بر روی آنها بدهید؟ یا حتی بخواهید ترکیبی از داده های چند ستون متفاوت را نمایش دهید؟ پاسخ احتمالاً بله خواهد بود ، فکر نکنم کسی باشد. اینجاست که مفهوم Accessors و mutators میتواند به مرحله اجرا در بیاید.

اجازه بدین تا به شما نشان دهم منظورشان چیست و چگونه کار می کنند.

اکسسورس (Accessors )

فرض کنید ما در جدول کاربر(user) برای کاربران خود دو فیلد داریم: first_name و last_name. و اگرچه در صورت لزوم می توان از این دو قسمت استفاده کرد ، اما گاهی اوقات برای نشان دادن نام کامل به عنوان یک پارامتر ، نیاز به ترکیب این دو پارامتر میباشیم، به طور کلی باید عملیاتی بر روی آنها انجام دهیم. این کار را به دوصورت میتوان انجام داد:

1- روش ساده (لوحانه)

{{ $user->first_name . ' ' . $user->last_name }}

2- به روش لاراول

{{ $user->full_name }}

در این روش شما با اضافه کردن یک تابع در مدل مربوط به user می توانید به راحتی با یک پارامتر به تمامی پارامترها دست پیدا کنید.

ما برای تعریف این تابع به مدل مربوطه رفته و تابع موردنظر را به این صورت تعریف میکنیم:

public function getFullNameAttribute()	 	 
{	 	 
    return $this->first_name . &quot &quot . $this->last_name;	 	 
}

بنابراین اتفاقی که در اینجا می افتد، اینگونه است که ما تابعی را ایجاد کرده ایم که هر بار که نام کامل (full_name) فراخوانی می شود از این تابع که در مدل هست نام کامل را با ترکیب نام و نام خانوادگی بر میگرداند.

برای تعریف Accessors فقط کافی است از الگوی ()get[attribute_name]Attribute پیروی کنید.

امایی وجود دارد.

شما نمی توانید از این ویژگی (full_name) درelequent queries استفاده کنید ، می توانید از این ویژگی فقط در collection استفاده کنید ، زیرا همانطور که میدانید elequent queries بر روی فیلدهای دیتابیس پردازش میکنند.

بطور مثال کد زیر را درنظر بگیرید:

$users = User::orderBy('full_name')->get();

این کد کار نمیکند. اما:

$users = User::all()->sortBy('full_name');

مورد فوق بخوبی کار میکند زیرا sortBy بر روی collection ها کار کند. بنابراین پس از جمع آوری نام کامل کاربران می توانیم با استفاده از تابع sortBy آن را مرتب کنیم.

میوتیترز (Mutators)

اگر با زبان OOP کار کرده اید ، با روش های setter و getter آشنا هستید. بنابراین ، Accessors نقش getter و Mutators نقش setter را دارد .

بعبارتی دیگر، فرض کنید ما یک company_ name داریم و می خواهیم وقتی در دیتابیس ذخیره می شود بصورت حروف بزرگ باشد. ما می توانیم با استفاده از Mutators به آن دست یابیم.

public function setCompanyNameAttribute($value)
{
    $this->attributes['company_name'] = strtoupper($value);
}

و میتوان بصورت زیر استفاده کرد:

$user->company_name = Input::get('company');
$user->save();

در لاراول ، هر شی از مدل دارای دو مقدار اصلی و ویژگی است و با تغییر هر مقدار در collection، ما در واقع مقدار ویژگی را تغییر می دهیم و این همان چیزی است که در دیتابیس ذخیره می شود یا در blade یا هر روشی که مایلید میتوانید استفاده کنید.

امیدوارم که این پست را دوست داشته باشید./