فریمورک لاراول قابلیتهای بسیاری دارد، اما تمام آنها را نمیتوانید در مستند رسمی سایت لاراول پیدا کنید. در این مقاله ۱۰ قابلیت eloquent که کارآمد هستند ولی ممکن است با آنها آشنا نباشید را بررسی میکنیم.
۱- گرفتن مقادیر اصلی یک مدل (Original Attributes of Model)
بعد از اینکه روی مقادیر درون یک مدل تغییراتی را اعمال میکنیم ولی هنوز در دیتابیس این تغییرات را ثبت نکردهایم میتوانیم با صدا زدن متد ()getOriginal
روی مدل مقادیر اولیه که از دیتابیس گرفتهبودیم را ببینیم.
$user = App\Models\User::first();
$user->name; //Fereydouni
$user->name = "Feri"; //تغییر اسم کاربر
$user->getOriginal('name'); //Fereydouni
$user->getOriginal(); //Original $user record
۲- بررسی اینکه آیا مدل تغییر کردهاست؟
برای اینکه بفهمیم بعد از اینکه مدل را از دیتابیس گرفتیم، تغییری روی آن اعمال شده یا نه میتوانیم از متد ()isDirty
استفاده کنیم.
$user = App\Models\User::first();
$user->isDirty(); //false
$user->name = "Feri"; //روی مدل تغییر اعمال میکنیم
$user->isDirty(); //true
همچنین میتوانیم بررسی کنیم که یک فیلد مشخص از مدل تغییر کرده است یا خیر.
$user->isDirty('name'); //true
$user->isDirty('age'); //false
۳- دیدن تغییرات اعمالشده روی مدل
با استفاده از متد ()getChanges
میتوانیم ببینیم کدام فیلدهای مدل تغییر کرده اند.
$user->getChanges();
//[
// "name" => "Feri",
//]
*توجه: تغییراتی که روی مدل انجام میدهید تنها وقتی که مدل را save کنید یا تغییرات را با استفاده از متد ()syncChanges
تثبیت کنید، در دیتابیس ذخیره میشوند.
۴. ستون deleted_at شخصیسازی شده
به صورت پیشفرض، لاراول قابلیت soft delete را با استفاده از ستون deleted_at فراهم میکند. شما میتوانید به صورت صریح اسم ستون جایگزینی که میخواهید از آن استفاده شود را درون مدل خود و با مقداردهی به ثابت DELETED_AT اعلام کنید.
class User extends Model
{
use SoftDeletes;
/**
* The name of the "deleted at" column.
*
* @var string
*/
const DELETED_AT = 'is_deleted';
}
روش دیگری که میتوانید این کار را انجام دهید با بازتعریف متد getDeletedAtColumn روی مدل است.
class User extends Model
{
use SoftDeletes;
public function getDeletedAtColumn()
{
return 'is_deleted';
}
}
۵- ذخیرهی مدل به همراه روابط آن
شما میتوانید با استفاده از متد ()push
مدل و روابط آن را ذخیره کنید.
class User extends Model
{
public function phone()
{
return $this->hasOne('App\Models\Phone');
}
}
$user = User::first();
$user->name = "Feri";
$user->phone->number = '1234567890';
$user->push(); // This will update both user and phone record in DB
۶- بازخوانی یک شیء جدید مدل از دیتابیس
با استفاده از متد ()fresh
شما میتوانید یک شیء جدید از مدل ایجاد کنید که اطلاعات بهروز را از دیتابیس گرفته است. فرض کنید شما یک شیئ از مدل user را از دیتابیس گرفته اید و در جای دیگری از برنامه روی دیتای آن در دیتابیس یک تغییر اعمال میشود. با این متد یک مدل جدید که دادههای بهروز را دارد به شما داده میشود.
$user = App\Models\User::first();
$user->name; // Fereydouni
// user record get updated by another thread. eg: 'name' changed to // Feri.
$updatedUser = $user->fresh();
$updatedUser->name; // Feri
$user->name; // Fereydouni
۷- بهروز کردن شیء موجود از یک مدل با استفاده از دادههای جدید در دیتابیس
با استفاده از متد ()refresh
مدل موجود دادههای خود را دوباره از دیتابیس میگیرد و شما به دادههای جدید دسترسی دارید.
$user = App\Models\User::first();
$user->name; // Fereydouni
// user record get updated by another thread. eg: 'name' changed to // Feri.
$user->refresh();
$user->name; // Feri
*توجه: متد ()refresh تمامی روابطی که روی مدل گرفته شدهبودند را بهروز میکند.
۸- بررسی کردن اینکه آیا دو مدل با هم یکی هستند یا نه
شرط تساوی دو مدل، یکی بودن آنها ID و جدولی که به آن تعلق دارند است. متد ()is
امکان بررسی این تساوی را به ما میدهد.
$user = App\Models\User::find(1);
$sameUser = App\Models\User::find(1);
$differentUser = App\Models\User::find(2);
$user->is($sameUser); // true
$user->is($differentUser); // false
۹- کلون گرفتن از یک مدل
شما میتوانید با متد ()replicate
از شیء مدل، یک کلون بگیرید. این شیئ جدید دقیقا شبیه به شیء اصلی است اما هنوز در دیتابیس ثبت نشده است. شما میتوانید با متد ()save
آن را ذخیره کنید.
$user = App\Models\User::find(1);
$newUser = $user->replicate();
$newUser->save();
۱۰- مشخص کردن ستونهای دلخواه در متد ()find
شما میتوانید هنگام استفاده از متد ()find
یا ()findOrFail
، مشخص کنید چه فیلدهایی از دیتابیس خوانده شوند. با اینکار کوئری شما بهینهتر شده و مصرف مموری شما کاهش مییابد.
$user = App\Models\User::find(1, ['name', 'age']);
$user = App\Models\User::findOrFail(1, ['name', 'age']);
این مقاله ترجمهای از 10Hidden Laravel Eloquent Features You May Not Know است. امیدوارم برای شما مفید بوده باشد. اگر شما هم قابلیتی میشناسید که کمتر به آن پرداختهشده است در قسمت نظرات با ما به اشتراک بگذارید.