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
شرح میدهم:
- تعریف مدلها:
ابتدا باید مدلهایModel1
وModel2
را تعریف کنید. به عنوان مثال، مدلModel1
وModel2
به ترتیب به نامهایModel1
وModel2
تعریف شدهاند. - تعریف رابطه در هر دو مدل:
در هر مدل، باید رابطه را با استفاده از روش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 را میتوانید ببینید:
- استفاده از عبارات WHERE پیچیده: با استفاده از عبارات WHERE پیچیده (مانند OR یا AND) میتوانید شرایط مرتبط را تعیین کنید. به عنوان مثال:
$users = User::where('age', '>', 18) ->orWhere('is_admin', true) ->get();
این درخواست تمامی کاربرانی را که سنشان بیشتر از ۱۸ سال یا مدیر هستند، برمیگرداند.
- جستجوی توسط کلمات کلیدی: برای جستجو در فیلدهای مشخص، میتوانید از عبارت
where
با استفاده از الگوهای عبور و تطابق (wildcard patterns and matches) استفاده کنید. به عنوان مثال:
$users = User::where('name', 'like', 'John%') ->get();
این درخواست تمامی کاربرانی را که نامشان با “John” شروع میشود، برمیگرداند.
- ترتیببندی نتایج: با استفاده از متد
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 برای رفع این مسائل استفاده میشود. آشنایی بیشتر با این قابلیت، سرعت کار برنامهنویسان را به طور قابل توجهی افزایش میدهد و کیفیت برنامهها را بهبود میبخشد.