نماد سایت امپراطوری من

۱۰ ویژگی مهم Eloquent که ممکن است ندانید!

لاراول یک فریم‌ورک پر از امکانات است اما شما نمی‌توانید تمام این امکانات را در مستندات سایت لاراول مشاهده کنید.در این مطلب قصد داریم در مورد امکاناتی از Eloquent صحبت کنیم که کمتر به آن پرداخته شده است. این امکانات به شما کمک می‌کند تا کدنویسی تمیز تر و خوانا‌تری داشته باشید.

[divider]

۱۰ ویژگی مهم Eloquent

بعد از اینکه یک مدل Eloquent را دستکاری کنید و attribute های آن را تغییر دهید، به کمک این تابع می‌توانید مقادیری که قبل از دستکاری وجود داشتند را مشاهده کنید. به نمونه کد زیر دقت کنید:


$user = App\User::first();
$user->name; //John

$user->name = "Peter"; //Peter

$user->getOriginal('name'); //John
$user->getOriginal(); //Original $user record

 

 

[divider]

گاهی ممکن است در روند کدنویسی شما برخی از attribute های یک مدل دستکاری شوند، به کمک تابع isDirty شما می‌توانید بررسی کنید که مدل یا attribute های آن تغییر کرده‌اند یا خیر. به نمونه کد زیر توجه کنید:


$user = App\User::first();
$user->isDirty(); //false

$user->name = "Peter";
$user->isDirty(); //true

 

 

[divider]

به کمک این متد، شما می‌توانید لیستی از attribute هایی که تغییر کرده‌اند را به دست آورید. در واقع زمانی که attribute های یک مدل تعییر کنند، تا زمانی که آن مدل save نشود، تغییرات اعمال نشده‌اند. همچنین علاوه بر متد save می‌توان از متد syncChanges استفاده کرد. به نمونه کد زیر توجه فرمایید:

$user->getChanges()

//[
"name" => "Peter",
]

[divider]

 

به طور پیشفرض، لاراول در زمان استفاده از soft delete ستون deleted_at را بررسی میکند. شما می‌توانید بطور صریح(explicitly) این ستون را به ستون دلخواه خود تغییر دهید. کافیست ویژگی DELETED_AT مدل را که یک const است را به ستون دلخواه تغییر دهید. به نمونه کد زیر توجه کنید:


class User extends Model
{
use SoftDeletes;

* The name of the "deleted at" column.
*
* @var string
*/
const DELETED_AT = 'is_deleted';
}

و یا به کمک تعریف یک accessor در مدل:


class User extends Model
{
use SoftDeletes;

public function getDeletedAtColumn()
{
return 'is_deleted';
}
}

[divider]

در بسیاری از مواقع ممکن است هم مدل تغییر کند و هم مدل دیگری که با آن در ارتباط است. به جای ذخیره کردن تک تک این مدل‌ها برای اعمال تغییرات، می‌توانید به سادگی تغییرات را ایجاد کرده و مدل مورد نظر را با تمام روابط اش ذخیره کنید. این عمل با دستور push اتفاق می‌افتد. به نمونه کد زیر توجه کنید:


class User extends Model
{
public function phone()
{
return $this->hasOne('App\Phone');
}
}

$user = User::first();
$user->name = "Peter";

$user->phone->number = '1234567890';

$user->push(); // This will update both user and phone record in DB

[divider]

ممکن است در جریان کدنویسی بطور همزمان در thread دیگر، مدل شما تغییر کند. حال وقتی شما مدل را از پایگاه داده خواندید، این تغییرات جدید بر روی مدل اعمال نشده بود. برای دریافت این تغییرات، می‌توان از متد fresh استفاده کرد. این متد یک نمونه از مدل را که حاوی تغییرات جدید است، به شما می‌دهد.


$user = App\User::first();
$user->name; // John

// user record get updated by another thread.
// eg: 'name' changed to // Peter.

$updatedUser = $user->fresh();
$updatedUser->name; // Peter

$user->name; // John

[divider]

اگر می‌خواهید در زمان ذخیره کردن مدل، تغییراتی که بطور همزمان بر روی مدل بوجود آمده را بر روی مدل اعمال کنید، باید از متد refresh استفاده کنید.


$user = App\User::first();
$user->name; // John

// user record get updated by another thread.
// eg: 'name' changed to // Peter.

$user->refresh();
$user->name; // Peter

[divider]

در زمان استفاده از Eloquent به کمک متد is میتوانید بررسی کنید که آیا دو مدل یکی هستند یا خیر! برای استفاده از این متد میتوانید از نمونه کد زیر استفاده کنید:


$user = App\User::find(1);
$sameUser = App\User::find(1);
$diffUser = App\User::find(2);

$user->is($sameUser); // true
$user->is($diffUser); // false

به کمک متدل replicate شما می‌توانید از مدل خود یک کپی بسازید. این مدل جدید قابل save کردن است و در صورت ذخیره کردن‌ش شناسه منحصر به فردی بدست خواهد آورد. البته باید توجه داشته باشید که در جدول مدلتان، بجز شناسه، کلید دیگری وجود نداشته باشد.


$user = App\User::find(1);
$newUser = $user->replicate();

$newUser->save();

[divider]

زمانی که از متد find و یا findOrFail استفاده می‌کنید، می‌توانید به کمک پارامتر دوم که یک آرایه است، attribute های مورد نیاز خود را اعلام کنید تا نتیجه حاصل، صرفا شامل همان attribute ها باشد.


$user = App\User::find(1, ['name', 'age']);

$user = App\User::findOrFail(1, ['name', 'age']);

موفق و پیروز باشید…

خروج از نسخه موبایل