تعداد بازدید: 4481

Eloquent Model

object relational mapping یا ORM سیستمی پیاده سازی شده رابط میان شی و پایگاه داده است به معنی این که هر سطر از جدول برابر یک شی است. با کمک ORM ما پیاده سازی پایگاه داده ما به اشیا نزدیک تر خواهد بود.

به زبان ساده تر Query Builder روی یک سطر از یک جدول با تمامی روابط سطر مربوطه با سطرهای دیگر از جداول دیگر یک شئ از کلاس مدل می باشد. به عبارت دیگر هر شئ از کلاس مدل با یک سطر از یک جدول ارتباط دارد.

اولین گام در Eloquent ساخت یک model است. هر model با برقراری ارتباط با پایگاه داده اطلاعات لازم برای controller فراهم می کند.در ساختار eloquent هر مدل مرتبط با یک جدول است. هر کلاس model نامی مفرد به ازای نام جمع جدول مربوطه خود دارد و از کلاس Model از مسیر Illuminate\Database\Eloquent\Model ارث بری می کند.

قوانین پیاده سازی Model در لاراول

نام جدول : مدل باید مفرد نام جدول موجود در پایگاه داده باشد. برای مثال جدول Products مدل Product . چون هر instance از کلاس model برابر یک شئ خواهد بود. اگر مجبور به استفاده از مدل یا جدولی با نام متفاوت بودیم باید property زیر با به کلاس مدل بدهیم.

کلید اصلی : eloquent در نظر می گیرد که کلید اصلی جدول شما id باشد. اگر نام دیگری مد نظر دارید property با نام primaryKey را با نام ستون کلید اصلی به کلاس مدل اضافه کنید.

نکته : هیچ گاه جدولی رو بدون کلید اصلی تعریف نکنید چرا که هر فیلدی که به‌عنوان کلید اصلی انتخاب بشه RDMS روی اون فیلد ایندکس انجام می‌ده و دسترسی به اون table با اون فیلد به شدت سریع‌تر می‌شه.

timestamps : زمان ذخیره سازی و بروزرسانی ردیف (created_at , updated_at) به صورت پیش فرض برای مدل در نظر گرفته می شود و همچنین زمان ساخت migration این دو ستون در جدول موجود می باشد. اگر مایل به استفاده از این دو ستون نیستید property با نام timestamps را برابر با false قرار دهید.

fillable : فیلدهایی از شئ که قابل تغییر باشند (CRUD). این فیلد ها را باید در قالب آرایه ای به متغیر fillable موجود در کلاس model بدهیم.

hidden : فیلدهایی از شئ یا همان ستون هایی از جدول شئ model که قابل تغییر نباشند (CRUD).

class Product extends Model {
    protected $table;
    protected $primaryKey = 'id';
    protected $fillable = [];
    protected $hidden = [];
}

نکته : برخی از متغیر های protected برای Eloquent Model به صورت پیش فرض از روی مدل ساخته می شوند و نیاز به تعریف مجدد توسط شما ندارند. مثلا متغیر $table به صورت پیش فرض از روی نام جمع مدل تعیین می شود. برخی دیگر نیز مثل fillable و hidden باید از سوی شما تعیین گردد.

ساخت مدل با artisan

برای ساخت model از دستور make:model استفاده می کنیم

artisan make:model Product

نگاه شئ گرایانه – Object Oriented Thinking

زمانی که یک شئ از یک model ساخته میشه با اون مثل یک محصول برخورد میشه. مثلا میشه نام براش انتخاب کرد و توضیح گذاشت و سایر مقادیرش رو set کرد و از عملگر های اون نظیر save نیز استفاده کرد.

به عبارت دیگر وقتی شئ product ساخته میشه ما به تمامی Attributes و methods دسترسی داریم.

$product = new App\product;
$product->name = 'Lamy Safari';
$product->price = 100;
$product->description = 'Good Fountain Pen';
$product->status = 1;
$product->save();

اتفاقات بالا زمانی که در محیط نرم افزار باشیم پنلی داریم که در اون فیلد هایی هست که ما می توانیم مقادیر رو براشون set کنیم و با زدن روی دکمه ذخیره از عملگر های اون استفاده کنیم. ولی زمانی که ما در محیط توسعه هستیم با ابزار tinker می تونیم کدهای بالا رو اجرا کنیم.

پس برنامه نویسی شئ گرا نحوه عملکرد نرم افزار رو در محیط توسعه نیز به سمت محیط تجاری اون میبره. استفاده از tinker نمونه ای از این استفاده است.

برای استفاده از tinker کافی است که کد زیر را در terminal وارد کنید و بعد در محیطی که آمد کدهای پی اچ پی را وارد کنید.

php artisan tinker

Dynamic Property

همان طور که در کد بالا دیدیم پس از ساخت شئ از روی کلاس model مربوطه (در مثال ما Product) یک سری attribute هایی بر اساس نام ستون های ردیف جدول مربوطه برای شئ ما قابل دستیابی هستند که می توان به ازای شئ ساخته شده مقدار دهی و بازیابی گردند. به این attribute ها dynamic property گفته می شود.

گرفتن داده از DataBase در model

در مبحث Query Builder ما به یک جدول خاص متصل و اطلاعات را با متدهای زنجیر شده به هم (method chain) می گرفتیم. حال در model وقتی  از کلاس استفاده می کنیم یعنی تا مرحله DB::table('users') پیش رفتیم. جدول ما برابر با جدولی که مربوط به مدل است می باشد.

DB::table(‘products’) ⇔ App\Product

نکته : تمامی متدهای موجود در query builder برای Eloquent model نیز کاربرد دارد. یعنی شما می تونید با استفاده از کلاس model مربوطه با هر نامی (مثلا Product) که برگرفته از نام جدول نیز می باشد می توانید به متد های بیشتری نیز دسترسی داشته باشید ،‌ پس به عبارت ساده تر :

model دارای متدهایی است حاوی Query هایی مبتنی بر جدول بنا شده بر مدل و همچنین روابط بکار رفته بر اساس قوانین Eloquent.

پس می توان گفت اجرا دستور به دو شکل امکان پذیر می باشد :

  • Eloquent approach : استفاده از امکانات Model در Eloquent ORM
  • Query Builder approach : استفاده از QueryBuilder

Single Model

در تفکر شئ گرایانه در لاراول ما زمانی که می خواستیم یک محصول اضافه کنیم یک شئ آماده می کردیم و بعد آن را مقدار دهیم می کردیم و ذخیره می کردیم. زمانی که یک محصول از پایگاه داده می گیریم نیز در حقیقت یک شئ (Eloquent Collection) را میگیریم. یعنی به یک سری Arribute و Methods دسترسی داریم.

موجودیت در قالب شئ ♣ محصول در قالب یک شئ زنده با ویژگی ها و عملگرها

$flight = App\product::find(1);
$flight = App\product::where('status', 1)->first();

نکته : اگر سطر مورد نظر (شئ) یافت نشد نتیجه False برمی گرداند و بازگرداندن False به عنوان پارامتر به view می تواند یک اتفاق ناگوار برایمان باشد زیرا در آنجا متغیرهایی نیاز است که ما در نتیجه False نداریم.  برای این که به خطا پیش فرض بخوریم می توانیم از مکانیزم Not Found Exceptions استفاده کنیم. به این ترتیب که اگر شی مورد نظر یافت نشده به صفحه ۴۰۴ برود.

public function single($id)
{
    $product = products::findOrFail($id);
    return view('single-product',compact('product'));       
}

خط کد بالا معادل بهینه شده کدهای زیر است :

public function single($id)
{
    $product = products::find($id);
    if(!empty($product)){
        $title = $product->name;
        return view('single-product',compact('product'));
    }else{
        abort(404);
    }        
}

همان طور که ما find و first داریم معادل آن findOrFail و firstOrFail را داریم.

نکته : همان طور که در مثال های بالا مشاهده کردیم متد save برای ذخیره سازی و بروزرسانی فیلد های اشیا یا در مثال ما محصول استفاده داشتند.

Mass Assignment attributes

گفتیم که در Eloquent ORM هر ردیف از جدول پایگاه داده برابر با یک شئ از مدل مربوط به آن است. (موقتا از روابط میان جداول چشم پوشی کنید)

هر شئ ساخته شده از مدل دارای یک سری attribute می باشد که معادل ستون هایی از ردیف جدول مربوطه می باشد. خوب این که چه attribute هایی از شئ مربوطه با چه ستون هایی از ردیف جدول معادل سازی گردند و چه ستون هایی باید محافظت شود از (update , create) با استفاده از fillable و hidden در وب سایت معین شوند.

  • fillable : فیلد های مجاز (attribute) برای بروز رسانی و نمایش در شئ ساخته شده از روی model.
  • hidden : فیلد های غیر مجاز (attribute) برای بروز رسانی و نمایش در شئ ساخته شده از روی model.

با استفاده از مواردی که در بالا گفته شد می توان در زمان ساخت شئ از روی کلاس model مربوطه این attribute ها را مقدار دهی کرد. همچنین می توان مقادیر این attribute ها را با استفاده از خاصیت Dynamic Property مقداردهی کرد.

نکته : زمانی که یک شئ از یک مدل را با استفاده از متد ها می گیرید اگر به صورت خام (collection) باشد تمامی ستون های آن موجود است و اگر به صورت آرایه (array) باشد تمامی ستون هایی که در قسمت hidden تعریف شده باشند موجود نمی باشد.

پس رابطه میان MassAssignment و Model و TableRow به شکل زیر است.

TableRow ⇒ MassAssignment ⇐ Model

Mass Updates

برای بروزرسانی اطلاعات شئ مورد نظر در پایگاه داده پس از یافتن محصول به ازای هر دستور(find , where) می باشد. متد update آرایه ای از ستون های بروزرسانی می گیرد.

//update all product have published in shop
App\products::where('status',1)->update(['price'=>75]);
//update product with id = 1
App\products::find(1)->update(['priec' => 78]);

اعمال متد update روی شئ instanse شده از روی model .

Mass Assignment

با استفاده از متد create از کلاس model می توان شئ جدید اضافه کرد. ورودی این متد آرایه ای از فیلدهای مد نظر جهت پر شدن در سطر جدول می باشد.

App\products::create(
    ['name'=>'Lamy Noto',
    'status'=>1,
    'price'=>32,
    'weight'=>12,
    'description'=>'Good Pen']
);

این متد پس از انجام در صورت موفقیت آمیز بودن پروسه شئ ساخته شده را بر می گرداند.

نکته : اگر فیلد های مورد نظر جهت بروزرسانی یا ذخیره سازی جزو فیلد های fillable در کلاس model نباشد Mass Assignment Error خواهیم داشت.

نکته : بر اساس گفته های ما تا اینجا ساخت شی و ذخیره سازی آن در سیستم به دو روش زیر امکان پذیر است :

  1. ساخت شی از روی کلاس و مقدار دهی از طریق Dynamic Property و در نهایت ذخیره سازی با استفاده از متد save .
  2. استفاده از Facade و متد create .

Deleting Models

پیاده سازی delete روی شئ instanse شده روی model باعث میشه اون شئ پاک بشه.

//Example 1
$product = App\product::find(1);
$product->delete();
//Example 2 - delete all product published
App\product::where('status',1)->delete();

نتیجه گیری: نکاتی که در رابطه با هر مدل تا به اینجا آموختیم :

  • ساخت مدل با استفاده از artisan make:model و قالب های نام گذاری مربوط به model و migration.
  • تعیین Mass Assignment attribute به عنوان دو peroperty مهم از کلاس model.
  • ساخت شئ از روی کلاس model مربوطه و عملیات Update , Assignment .
  • دریافت اطلاعات از شئ مدل ساخته شده.

اشتراک گذاری :

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

۰ دیدگاه برای Eloquent Model

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *