برنامه نویسی

Laravel Eloquent چیست و چه کاربردی دارد + مثال کاربردی

همواره برای برنامه‌نویسان، برقراری ارتباط بین یک برنامه و پایگاه داده آن چالش‌هایی را به همراه داشته است. اما فریم‌ورک Laravel، به نسبت رقبا، یک ویژگی منحصر به فرد به نام Eloquent ORM دارد که در مقاله “تست نویسی در لاراول (Laravel) چیست” به طور کامل بررسی شده است. استفاده از قابلیت Laravel Eloquent، برقراری ارتباط بین هر برنامه و پایگاه داده مربوط به آن تنها چند ثانیه زمان می‌برد.

Laravel Eloquent چگونه کار میکند؟

Laravel Eloquent یک ORM (Object-Relational Mapping) است که توسط فریم‌ورک Laravel ارائه شده است. ORM به معنای نگاشت شیء-رابطه است و وظیفه آن برقراری ارتباط بین شیء‌های برنامه و جداول پایگاه داده را ساده‌تر می‌کند.در Laravel، با استفاده از Eloquent می‌توانید به راحتی با جداول پایگاه داده کار کنید بدون نیاز به نوشتن کوئری‌های SQL. این ORM به شما امکان می‌دهد تا با استفاده از مدل‌ها، به داده‌ها در پایگاه داده دسترسی پیدا کنید و آن‌ها را تغییر دهید.

برای شروع، ابتدا باید مدل‌های Eloquent را تعریف کنید. هر مدل معمولاً با یک جدول مشابه در پایگاه داده مرتبط می‌شود. شما می‌توانید روابط بین مدل‌ها را تعریف کنید، مثلاً رابطه یک به چند، رابطه چند به چند و غیره.پس از تعریف مدل‌ها، می‌توانید با استفاده از روش‌هایی که Eloquent فراهم می‌کند، داده‌ها را دریافت، ایجاد، به‌روزرسانی و حذف کنید.

برای مثال، شما می‌توانید با استفاده از روش `find` یک رکورد با استفاده از کلید اصلی آن را بیابید، یا با استفاده از روش `create` یک رکورد جدید ایجاد کنید و آن را در پایگاه داده ذخیره کنید.همچنین Eloquent امکانات دیگری مانند ترتیب‌دهی، فیلترکردن، ارتباطات eager loading و غیره را نیز فراهم می‌کند.با استفاده از این روش‌ها و قابلیت‌ها، Eloquent به شما این امکان را می‌دهد تا به راحتی با پایگاه داده کار کنید و بدون نیاز به نوشتن کدهای SQL پیچیده، داده‌ها را مدیریت کنید.

رابطه‌های چند به چند را با استفاده از Eloquent

برای تعریف رابطه چند به چند در Laravel Eloquent، شما باید از روش‌ها و قوانین مشخصی استفاده کنید. در زیر، روند تعریف رابطه چند به چند را با استفاده از Eloquent برای مدل‌های Model1 و Model2 شرح می‌دهم:

  1. تعریف مدل‌ها:
    ابتدا باید مدل‌های Model1 و Model2 را تعریف کنید. به عنوان مثال، مدل Model1 و Model2 به ترتیب به نام‌های Model1 و Model2 تعریف شده‌اند.
  2. تعریف رابطه در هر دو مدل:
    در هر مدل، باید رابطه را با استفاده از روش belongsToMany تعریف کنید. این روش برای تعریف رابطه چند به چند استفاده می‌شود. در مدل Model1، به عنوان مثال، می‌توانید رابطه را به صورت زیر تعریف کنید:
public function model2s()
{
    return $this->belongsToMany(Model2::class);
}
```
````php
public function model1s()
{
    return $this->belongsToMany(Model1::class);
}
```

تعیین جدول پیوندی:
Laravel به طور خودکار جدول پیوندی را بر اساس نام مدل‌ها و ترتیب الفبایی نام آن‌ها تعیین می‌کند. اگر می‌خواهید نام جدول پیوندی را به صورت دستی مشخص کنید، می‌توانید آن را به روش belongsToMany به عنوان پارامتر دوم ارسال کنید، مانند:

 return $this->belongsToMany(Model2::class, 'custom_table_name').

دسترسی به رابطه:
حالا می‌توانید به رابطه چند به چند دسترسی پیدا کنید. برای مثال، اگر یک نمونه از Model1 را داشته باشید، می‌توانید تمام نمونه‌های مرتبط از Model2 را با استفاده از رابطه model2s به صورت زیر بدست آورید:

$model1 = Model1::find(1);
$relatedModel2s = $model1->model2s;

در این روند، شما می‌توانید رابطه چند به چند بین دو مدل را با استفاده از Eloquent تعریف کنید و از آن استفاده کنید.

ساخت و سفارشی سازی Model در laravel

برای ساخت و سفارشی سازی یک مدل در Laravel، شما باید از کلاس Illuminate\Database\Eloquent\Model استفاده کنید و سپس متدها و ویژگی‌های مورد نیاز خود را به مدل اضافه کنید. در زیر روند ساخت و سفارشی سازی یک مدل را شرح می‌دهیم.

ایجاد مدل:
ابتدا باید یک فایل جدید برای مدل خود ایجاد کنید. به عنوان مثال، فایل را MyModel.php نامگذاری کنید و آن را در مسیر app/Models قرار دهید.

ارث‌بری از کلاس Model:
در فایل مدل MyModel.php، کلاس مدل را ایجاد کنید و از کلاس Illuminate\Database\Eloquent\Model ارث‌بری کنید، مانند زیر:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class MyModel extends Model
}

تعریف جدول مرتبط:
اگر نام جدول مرتبط با مدل شما متفاوت است، می‌توانید آن را به صورت دستی مشخص کنید. برای این کار، به خاصیت table در مدل خود مقدار دهی کنید. به عنوان مثال، اگر نام جدول شما my_custom_table است، می‌توانید کد زیر را به مدل اضافه کنید:

protected $table = 'my_custom_table';

تعریف کلید اصلی:
اگر نام کلید اصلی جدول شما متفاوت است، می‌توانید آن را نیز به صورت دستی مشخص کنید. برای این کار، به خاصیت primaryKey در مدل خود مقدار دهی کنید.

به عنوان مثال، اگر نام کلید اصلی شما my_custom_id است، می‌توانید کد زیر را به مدل اضافه کنید:

protected $primaryKey = 'my_custom_id';

تعریف زمان‌های بروزرسانی و ایجاد: اگر می‌خواهید زمان‌های بروزرسانی و ایجاد را در مدل خود ثبت کنید، می‌توانید از خاصیت timestamps استفاده کنید. به طور پیش‌فرض، این خاصیت در مدل‌های Laravel فعال است. اگر نمی‌خواهید از زمان‌ها استفاده کنید، می‌توانید این خاصیت را به صورت زیر در مدل خود غیرفعال کنید:

public $timestamps = false;
```

تعریف روابط:
شما می‌توانید روابط مختلف را در مدل خود تعریف کنید. از روش‌های مختلفی مانند hasOne، hasMany، belongsTo و belongsToMany برای تعریف روابط استفاده کنید.۷. تعریف فیلدها و مشخصات مدل:
شما می‌توانید فیلدها و مشخصات مورد نیاز خود را در مدل تعریف کنید. برای مثال، اگر می‌خواهید یک فیلد name از نوع رشته را در مدل خود داشته باشید، می‌توانید به صورت زیر عمل کنید:

protected $fillable = ['name'];
```

نکته: در این مثال، ما یک روش `getFullNameAttribute` ایجاد کرده‌ایم که نام کامل مدل را برمی‌گرداند. با تعریف چنین روشی، می‌توانید به صورت `$model->full_name` به نام کامل دسترسی پیدا کنید.

آموزش Refresh کردن Model‌ با استفاده از Laravel Eloquent

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

برای استفاده از متد refresh، ابتدا باید یک شیء از مدل مورد نظر خود را بسازید و سپس متد refresh را روی آن فراخوانی کنید.

در ادامه یک مثال نشان می‌دهد که چگونه از متد refresh استفاده کنید:

use App\Models\MyModel;
$model = MyModel::find(1);
$model->refresh();

متد refresh تمام فیلدهای مدل را با مقادیر جدید از پایگاه داده به‌روز می‌کند. در صورتی که یک فیلد خاص را می‌خواهید به‌روز کنید، می‌توانید از متد refresh برای رفرش کردن مدل استفاده کنید و سپس مقدار مورد نظر را از مدل بخوانید.

$model->refresh();
$fieldValue = $model->field_name;

با استفاده از این روش، می‌توانید رکورد مورد نظر را از پایگاه داده بازیابی کنید و مقادیر آن را به‌روز کنید.

Query‌های پیشرفته هنگام استفاده از laravel eloquent

وقتی از Laravel Eloquent استفاده می‌کنید، می‌توانید از Query‌های پیشرفته برای ساختن درخواست‌های پیچیده و سفارشی استفاده کنید. این Query‌ها امکانات قدرتمندی را برای جستجو، مرتب‌سازی و ترکیب نتایج در دیتابیس فراهم می‌کنند. در زیر چند مثال از Query‌های پیشرفته در Laravel Eloquent را می‌توانید ببینید:

  1. استفاده از عبارات WHERE پیچیده: با استفاده از عبارات WHERE پیچیده (مانند OR یا AND) می‌توانید شرایط مرتبط را تعیین کنید. به عنوان مثال:
$users = User::where('age', '>', 18) ->orWhere('is_admin', true) ->get();

این درخواست تمامی کاربرانی را که سنشان بیشتر از ۱۸ سال یا مدیر هستند، برمی‌گرداند.

  1. جستجوی توسط کلمات کلیدی: برای جستجو در فیلدهای مشخص، می‌توانید از عبارت where با استفاده از الگوهای عبور و تطابق (wildcard patterns and matches) استفاده کنید. به عنوان مثال:
$users = User::where('name', 'like', 'John%') ->get();

این درخواست تمامی کاربرانی را که نامشان با “John” شروع می‌شود، برمی‌گرداند.

  1. ترتیب‌بندی نتایج: با استفاده از متد orderBy، می‌توانید نتایج را براساس فیلدهای مشخص یا شرایط خاصی مرتب کنید. به عنوان مثال:
$users = User::orderBy('created_at', 'desc') ->get();

این درخواست تمامی کاربران را برمی‌گرداند و آن‌ها را بر اساس تاریخ ایجاد نزولی مرتب می‌کند.

این تنها چند مثال از Query‌های پیشرفته در Laravel Eloquent هستند. امکانات بیشتری نیز در این ORM قدرتمند وجود دارد که شما می‌توانید از آن‌ها برای سفارشی‌سازی استفاده کنید.

نمایش Exception

برای نمایش Exception ها در Laravel، می‌توانید از ساده‌ترین روشی که فریمورک فراهم می‌کند استفاده کنید.

روش اول:
در فایل app/Exceptions/Handler.php متد render را پیدا کنید. این متد مسئول نمایش Exception ها است. شما می‌توانید کد زیر را در داخل متد render قرار دهید:

 public function render($request, Throwable $exception)
 {
     return parent::render($request, $exception);
 }

با اینکار، Laravel به طور پیش‌فرض اطلاعات مربوط به Exception را به شکل خطای HTTP 500 نشان می‌دهد. این کاربردی است زمانی که در محیط توسعه قرار دارید.

روش دوم:
اما اگر می‌خواهید اطلاعات دقیق‌تری درباره Exception ها دریافت کنید، می‌توانید از متد report در فایل app/Exceptions/Handler.php استفاده کنید. ابتدا متد report را پیدا کرده و کد زیر را در داخل آن قرار دهید:

 public function report(Throwable $exception)
 {
     if ($this->shouldReport($exception)) {
         Log::error($exception);
     }

     parent::report($exception);
 }

با این کار، شما Exception ها را در Log فایل شما ثبت خواهید کرد. می‌توانید این Log را با استفاده از ابزارهای مدیریت Log Laravel مشاهده کنید.

چگونگی بروزرسانی داده‌ها در Database توسط Model

در Laravel، برای بروزرسانی داده‌ها در دیتابیس از مدل‌ها و استفاده از Eloquent ORM می‌توانید به راحتی استفاده کنید. این کار به شما امکان می‌دهد از قابلیت‌های قدرتمند Eloquent برای بروزرسانی رکوردها استفاده کنید. برای بروزرسانی داده‌ها در دیتابیس، مراحل زیر را دنبال کنید:

ابتدا مدل مورد نظر خود را به دست آورید. برای مثال، اگر مدلی به نام User دارید، ابتدا آن را به دست آورید:

$user = User::find($id);

در اینجا $id شناسه رکوردی است که می‌خواهید بروزرسانی شود. سپس، مقادیر جدیدی که می‌خواهید در رکورد بروزرسانی کنید را تنظیم کنید. برای مثال، اگر می‌خواهید فیلد name را بروزرسانی کنید:

$user->name = 'John Doe';

در نهایت، تغییرات را در دیتابیس ذخیره کنید با استفاده از متد save روی مدل:

$user->save();

با این کار، تمام تغییراتی که در مدل اعمال کرده‌اید، در دیتابیس ذخیره می‌شوند.

چگونه داده‌ها را به Database اضافه کنیم همراه با Mass Assignment

برای ایجاد مستقیم یک داده در دیتابیس همراه با قابلیت Mass Assignment، می‌توانیم از دو روش firstOrCreate و firstOrNew در Laravel استفاده کنیم.

  • firstOrCreate: این متد ابتدا سعی می‌کند بر اساس مقادیری که به آن داده شده است، یک رکورد را از دیتابیس با استفاده از مدل پیدا کند. در صورتی که رکورد متناظری در دیتابیس پیدا نشود، به‌صورت خودکار یک رکورد با همان اطلاعاتی که وارد شده است، در دیتابیس ایجاد می‌شود.
  • firstOrNew: این متد نیز عملکردی مشابه با firstOrCreate دارد، با این تفاوت که در صورت پیدا نشدن رکورد متناظر، به‌جای ایجاد رکورد جدید، یک نمونه (instance) از مدل را برمی‌گرداند.

به‌عبارت دیگر، firstOrCreate در صورت عدم وجود رکورد، آن را ایجاد می‌کند، درحالی‌که firstOrNew تنها نمونه مدل را برمی‌گرداند و وظیفه ایجاد رکورد را به شما واگذار می‌کند.

// Retrieve flight by name, or create it if it doesn't exist...
$flight = App\Flight::firstOrCreate(['name' => 'Flight 10']);
// Retrieve flight by name, or create it with the name, delayed, and arrival_time attributes...
$flight = App\Flight::firstOrCreate(
    ['name' => 'Flight 10'],
    ['delayed' => 1, 'arrival_time' => '11:30']
);
// Retrieve by name, or instantiate...
$flight = App\Flight::firstOrNew(['name' => 'Flight 10']);
// Retrieve by name, or instantiate with the name, delayed, and arrival_time attributes...
$flight = App\Flight::firstOrNew(
    ['name' => 'Flight 10'],
    ['delayed' => 1, 'arrival_time' => '11:30']
);

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

// If there's a flight from Oakland to San Diego, set the price to $99.
// If no matching model exists, create one.
$flight = App\Flight::updateOrCreate(
    ['departure' => 'Oakland', 'destination' => 'San Diego'],
    ['price' => 99, 'discounted' => 1]
);

جمع بندی پایانی: آیا از Laravel Eloquent استفاده کنیم؟

یکی از مسائل اساسی که برنامه‌نویسان PHP با آن روبرو بودند، ایجاد و مدیریت ارتباط با دیتابیس و انجام عملیات‌های مختلف مانند افزودن، حذف، به‌روزرسانی و تغییرات ریز روی داده‌ها در دیتابیس بود. اما با استفاده از فریمورک لاراول، از ORM قدرتمند و Eloquent برای رفع این مسائل استفاده می‌شود. آشنایی بیشتر با این قابلیت، سرعت کار برنامه‌نویسان را به طور قابل توجهی افزایش می‌دهد و کیفیت برنامه‌ها را بهبود می‌بخشد.

پوریا گودرز

پوریا گودرز هستم‌ علاقه مند به مباحث‌ و‌‌ مشکلات مربوط به تکنولوژی و فناوری. همچنین اندک آشنایی در زمینه گرافیک دارم. امیدوارم بتونم مشکلات شما رو در این مباحث حل کنم . انتقادات خود را از بخش نظرات با من در میان بگذارید :)

نوشته های مشابه

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

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