سی ام اس نویسسی ام اس نویسیاد بگیر، سیستم خودتو بنویس
مجلهتماس با ما
سی ام اس نویسسی ام اس نویس

CMS نویس مرجعی برای آموزش برنامه نویسی وب و PHP، توسعه افزونه‌های اختصاصی وردپرس، طراحی ورک‌فلو و اتوماسیون با n8n و توسعه CMS های اختصاصی است. هدف ما ارائه آموزش‌های کاربردی و راهکارهای حرفه‌ای برای توسعه‌دهندگان، کسب‌وکارها و علاقه‌مندان به دنیای برنامه‌نویسی است.

پیوندهای سریع
محصولات فیزیکیمحصولات دیجیتالدوره‌های آموزشی
سی ام اس نویس
مجله سی ام اس نویستماس با ماپنل کاربری
سی ام اس نویس — تمامی حقوق برای سی ام اس نویس محفوظ است. © 1406 تماس با ما09307711941
Eloquent در Laravel چیست؟ آموزش کامل ORM لاراول و کار با دیتابیس

Eloquent در Laravel چیست؟ آموزش کامل ORM لاراول و کار با دیتابیس

ممدیر کل سیستم ۱۱ مهر ۱۴۰۵ ۲۱ دقیقه مطالعه ۱ بازدید
Eloquent در Laravel چیست؟ آموزش کامل ORM لاراول و کار با دیتابیس

وقتی یک پروژه Laravel را توسعه می‌دهید، بخش بزرگی از برنامه شما به دیتابیس وابسته است. ذخیره اطلاعات کاربران، محصولات، سفارش‌ها، مقالات، پرداخت‌ها و تقریباً هر داده دیگری در نهایت به عملیات روی دیتابیس منتهی می‌شود.

Laravel برای کار با دیتابیس ابزار قدرتمندی به نام Eloquent ORM در اختیار توسعه‌دهنده قرار می‌دهد.

Eloquent باعث می‌شود به‌جای نوشتن تعداد زیادی Query خام SQL، بتوانیم اطلاعات دیتابیس را با استفاده از Modelها و دستورات PHP مدیریت کنیم.

برای مثال، به‌جای نوشتن Query زیر:


SELECT * FROM products WHERE price > 1000000;

می‌توانیم در Laravel بنویسیم:


Product::where('price', '>', 1000000)->get();

این موضوع باعث می‌شود کد برنامه خواناتر، ساختاریافته‌تر و در بسیاری از موارد توسعه آن ساده‌تر شود.

در این مقاله یاد می‌گیریم Eloquent چیست، چگونه Model بسازیم، چگونه اطلاعات را بخوانیم و ذخیره کنیم، چگونه اطلاعات را ویرایش و حذف کنیم و چطور Queryهای مختلف را با Eloquent بنویسیم.


Eloquent در Laravel چیست؟

Eloquent ORM سیستم Object-Relational Mapping لاراول است که برای کار با دیتابیس استفاده می‌شود.

ORM یک لایه بین کد برنامه و دیتابیس ایجاد می‌کند.

به زبان ساده، در Eloquent معمولاً هر جدول دیتابیس را با یک Model در برنامه نمایش می‌دهیم.

برای مثال فرض کنید جدولی با نام:


products

داریم.

می‌توانیم یک Model به نام:


Product

داشته باشیم.

سپس به‌جای کار مستقیم با جدول، از Model استفاده کنیم:


$products = Product::all();

در اینجا Product نماینده جدول محصولات است.

Laravel از روی قراردادهای نام‌گذاری خود می‌تواند متوجه شود که Model Product باید به جدول products متصل شود.


ORM چیست؟

ORM مخفف:

Object-Relational Mapping

است.

وظیفه ORM این است که ساختارهای شیءگرا در برنامه را به داده‌های موجود در دیتابیس مرتبط کند.

بدون ORM ممکن است برای هر عملیات مجبور شویم SQL بنویسیم:


SELECT * FROM products;

اما با Eloquent:


Product::all();

یا:


Product::where('status', 'active')->get();

در نتیجه توسعه‌دهنده بیشتر با Model و Object کار می‌کند و کمتر مجبور است مستقیماً با SQL درگیر شود.


# Eloquent Model چیست؟

در Laravel، هر Eloquent Model معمولاً به یک جدول دیتابیس مرتبط است.

برای مثال:


Product

می‌تواند به جدول:


products

متصل باشد.

برای ساخت Model می‌توانیم از Artisan استفاده کنیم:


php artisan make:model Product

Laravel فایلی مشابه زیر ایجاد می‌کند:


app/

└── Models/

    └── Product.php

محتوای ساده Model می‌تواند به شکل زیر باشد:


<?php



namespace App\Models;



use Illuminate\Database\Eloquent\Model;



class Product extends Model

{

    //

}

حالا می‌توانیم در قسمت‌های مختلف برنامه از این Model استفاده کنیم.


# ارتباط Model و Table در Laravel

یکی از ویژگی‌های مهم Eloquent، قراردادهای نام‌گذاری آن است.

اگر Model شما:


Product

باشد، Laravel به‌صورت پیش‌فرض جدول زیر را در نظر می‌گیرد:


products

برای:


User

جدول پیش‌فرض:


users

و برای:


Order

جدول:


orders

است.

این قرارداد باعث می‌شود در بسیاری از پروژه‌ها نیازی به تنظیم دستی نام جدول نداشته باشیم.


تغییر نام جدول Model

اگر نام جدول با قرارداد معمول Laravel مطابقت نداشته باشد، می‌توانیم نام جدول را مشخص کنیم.

برای مثال:


class Product extends Model

{

    protected $table = 'shop_products';

}

در این حالت Model Product به جدول:


shop_products

متصل می‌شود.


# ساخت Model همراه با Migration

اگر می‌خواهید هم‌زمان با Model یک Migration نیز ایجاد کنید، می‌توانید از دستور زیر استفاده کنید:


php artisan make:model Product -m

این دستور Model و Migration را ایجاد می‌کند.

برای مثال ساختار پروژه می‌تواند شامل این دو فایل باشد:


app/Models/Product.php



database/migrations/

xxxx_xx_xx_xxxxxx_create_products_table.php

سپس می‌توانیم ساختار جدول را در Migration تعریف کنیم.

مثلاً:


Schema::create('products', function (Blueprint $table) {

    $table->id();

    $table->string('name');

    $table->decimal('price', 12, 2);

    $table->boolean('status')->default(true);

    $table->timestamps();

});

بعد Migration را اجرا می‌کنیم:


php artisan migrate


# ساخت Model با چند قابلیت به‌صورت هم‌زمان

Artisan امکان ساخت چند بخش مرتبط را نیز فراهم می‌کند.

برای مثال:


php artisan make:model Product -mfsc

بسته به گزینه‌های استفاده‌شده می‌توانیم Model، Migration، Factory، Seeder و موارد دیگر را ایجاد کنیم.

این قابلیت در پروژه‌های واقعی می‌تواند سرعت توسعه را افزایش دهد.


# خواندن اطلاعات با Eloquent

یکی از رایج‌ترین کارهایی که با Eloquent انجام می‌دهیم، خواندن اطلاعات از دیتابیس است.

فرض کنید Model زیر را داریم:


use App\Models\Product;

اکنون می‌توانیم تمام محصولات را دریافت کنیم:


$products = Product::all();

خروجی یک Collection از Modelهای Product خواهد بود.


دریافت اولین رکورد

برای دریافت اولین رکورد می‌توانیم از first() استفاده کنیم:


$product = Product::first();

اگر رکوردی وجود نداشته باشد، مقدار برگشتی null خواهد بود.

بنابراین می‌توانیم بررسی کنیم:


if ($product) {

    echo $product->name;

}


# پیدا کردن رکورد با ID

برای پیدا کردن یک رکورد با شناسه:


$product = Product::find(10);

در این مثال Laravel محصولی با ID برابر ۱۰ را جستجو می‌کند.

اگر چنین رکوردی وجود نداشته باشد، find() مقدار null برمی‌گرداند.


findOrFail

اگر می‌خواهیم در صورت پیدا نشدن رکورد، Laravel به‌صورت خودکار پاسخ خطای مناسب ایجاد کند، می‌توانیم از:


$product = Product::findOrFail(10);

استفاده کنیم.

این روش برای صفحات جزئیات بسیار کاربردی است.

مثلاً:


public function show($id)

{

    $product = Product::findOrFail($id);



    return view('products.show', compact('product'));

}


# firstOrFail

مشابه findOrFail، متد firstOrFail نیز وجود دارد:


$product = Product::where('slug', $slug)->firstOrFail();

اگر محصول پیدا نشود، Laravel خطای مناسب را ایجاد می‌کند.

این روش برای URLهایی مانند:


/products/iphone-17

بسیار کاربردی است.


# استفاده از where در Eloquent

یکی از مهم‌ترین قابلیت‌های Eloquent، ساخت Queryهای شرطی است.

مثلاً:


$products = Product::where('status', true)->get();

این Query تمام محصولاتی را دریافت می‌کند که وضعیت آن‌ها فعال است.


چند شرط در یک Query

می‌توانیم چند شرط را به هم متصل کنیم:


$products = Product::where('status', true)

    ->where('price', '>', 1000000)

    ->get();

در اینجا فقط محصولاتی دریافت می‌شوند که:

  • فعال باشند
  • قیمت آن‌ها بیشتر از یک میلیون باشد

# عملگرهای شرطی در Eloquent

مثلاً:


Product::where('price', '>', 1000000)->get();

یا:


Product::where('price', '<', 5000000)->get();

یا:


Product::where('price', '>=', 1000000)->get();

همچنین می‌توان از عملگرهای مختلف SQL مانند != و LIKE نیز استفاده کرد.

مثلاً:


Product::where('name', 'like', '%iphone%')->get();


# استفاده از orWhere

برای شرط OR می‌توانیم از orWhere استفاده کنیم:


$products = Product::where('status', true)

    ->orWhere('price', '<', 500000)

    ->get();

در Queryهای پیچیده‌تر بهتر است گروه‌بندی شرط‌ها را نیز در نظر بگیریم تا منطق SQL دقیقاً مطابق انتظار باشد.


# مرتب‌سازی اطلاعات

برای مرتب‌سازی می‌توانیم از orderBy استفاده کنیم:


$products = Product::orderBy('price', 'asc')->get();

برای مرتب‌سازی نزولی:


$products = Product::orderBy('price', 'desc')->get();


latest و oldest

برای دریافت جدیدترین رکوردها:


$products = Product::latest()->get();

و برای قدیمی‌ترین:


$products = Product::oldest()->get();

به‌صورت پیش‌فرض این متدها معمولاً بر اساس ستون زمانی مناسب مانند created_at عمل می‌کنند.


# محدود کردن تعداد نتایج

اگر فقط چند رکورد اول را می‌خواهیم:


$products = Product::limit(10)->get();

یا:


$products = Product::take(10)->get();

برای مثال:


$products = Product::latest()

    ->limit(10)

    ->get();

این Query جدیدترین ۱۰ محصول را دریافت می‌کند.


# select در Eloquent

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

مثلاً:


$products = Product::select('id', 'name', 'price')->get();

این کار مخصوصاً زمانی مفید است که جدول ستون‌های زیادی داشته باشد و فقط به چند ستون نیاز داشته باشیم.


# pluck در Eloquent

اگر فقط مقادیر یک ستون را نیاز داریم، pluck() می‌تواند مفید باشد:


$names = Product::pluck('name');

مثلاً برای دریافت شناسه محصولات:


$ids = Product::pluck('id');


# count و exists

برای شمارش رکوردها:


$count = Product::count();

برای بررسی وجود حداقل یک رکورد:


$exists = Product::where('status', true)->exists();

در بسیاری از موارد، وقتی فقط می‌خواهیم بدانیم رکوردی وجود دارد یا نه، exists() انتخاب مناسبی است و نیازی به دریافت تمام رکوردها نداریم.


# ایجاد رکورد با Eloquent

یکی از مهم‌ترین عملیات Eloquent، ایجاد رکورد جدید است.

دو روش متداول برای این کار استفاده از create() و save() است.


ایجاد رکورد با create

برای استفاده از create() باید Mass Assignment را به‌درستی تنظیم کنیم.

مثلاً در Model:


class Product extends Model

{

    protected $fillable = [

        'name',

        'price',

        'status',

    ];

}

حالا می‌توانیم بنویسیم:


$product = Product::create([

    'name' => 'Laptop',

    'price' => 50000000,

    'status' => true,

]);

Laravel رکورد جدید را در دیتابیس ایجاد می‌کند.


# Mass Assignment چیست؟

Mass Assignment یعنی مقداردهی چند ویژگی Model به‌صورت یکجا.

برای مثال:


Product::create([

    'name' => 'Laptop',

    'price' => 50000000,

]);

از آنجا که این داده‌ها ممکن است از Request کاربر وارد شوند، Laravel برای جلوگیری از مقداردهی ناخواسته فیلدها، مکانیزم Mass Assignment Protection را در اختیار ما قرار می‌دهد.


# fillable در Laravel

یکی از روش‌های متداول، تعریف $fillable است:


protected $fillable = [

    'name',

    'price',

    'status',

];

یعنی این فیلدها اجازه دارند از طریق Mass Assignment مقداردهی شوند.

برای مثال:


Product::create($request->all());

حتی اگر چنین کدی در شرایطی استفاده شود، Eloquent فقط فیلدهای مجاز را مطابق تنظیمات Mass Assignment در نظر می‌گیرد.

با این حال، از نظر امنیت و کنترل داده‌ها، بهتر است داده‌های ورودی را با Validation و داده‌های مشخص‌شده پردازش کنیم و صرفاً به $request->all() وابسته نباشیم.


# guarded در Laravel

روش دیگر استفاده از $guarded است.

مثلاً:


protected $guarded = [

    'id',

];

در این حالت مشخص می‌کنیم کدام فیلدها نباید از طریق Mass Assignment مقداردهی شوند.

در پروژه‌های واقعی، انتخاب بین fillable و guarded باید با توجه به ساختار Model و نیاز امنیتی پروژه انجام شود.


# ایجاد رکورد با save

روش دیگر ایجاد رکورد استفاده از یک Instance از Model است:


$product = new Product();



$product->name = 'Laptop';

$product->price = 50000000;

$product->status = true;



$product->save();

پس از اجرای save()، رکورد در دیتابیس ذخیره می‌شود.

این روش زمانی مفید است که بخواهیم قبل از ذخیره، منطق بیشتری روی Model اعمال کنیم.


# ویرایش اطلاعات با Eloquent

برای ویرایش رکورد ابتدا می‌توانیم آن را دریافت کنیم:


$product = Product::findOrFail(10);

سپس مقدار جدید را تعیین کنیم:


$product->price = 55000000;

$product->save();

یا می‌توانیم از update() استفاده کنیم:


$product->update([

    'price' => 55000000,

]);


# حذف اطلاعات

برای حذف یک Model:


$product = Product::findOrFail(10);



$product->delete();

همچنین می‌توانیم از:


Product::destroy(10);

استفاده کنیم.

اگر چند ID داشته باشیم:


Product::destroy([10, 11, 12]);


# عملیات CRUD در Eloquent

چهار عملیات اصلی دیتابیس معمولاً با عنوان CRUD شناخته می‌شوند:

عملیاتمفهوممثال
CreateایجادProduct::create()
ReadخواندنProduct::find()
Updateویرایش$product->update()
Deleteحذف$product->delete()

بخش زیادی از عملیات معمول دیتابیس در پروژه‌های Laravel بر اساس همین چهار عملیات شکل می‌گیرد.


# Queryهای زنجیره‌ای در Eloquent

یکی از نقاط قوت Eloquent امکان زنجیره کردن Queryها است.

برای مثال:


$products = Product::where('status', true)

    ->where('price', '>', 1000000)

    ->orderBy('price', 'desc')

    ->limit(20)

    ->get();

این ساختار خوانایی بالایی دارد و می‌توانیم Query را مرحله‌به‌مرحله توسعه دهیم.


# get با first چه تفاوتی دارد؟

این دو متد کاربرد متفاوتی دارند.

get() مجموعه‌ای از نتایج را برمی‌گرداند:


$products = Product::where('status', true)->get();

اما first() اولین نتیجه را برمی‌گرداند:


$product = Product::where('status', true)->first();

بنابراین اگر انتظار چند رکورد دارید، معمولاً get() مناسب است و اگر فقط یک رکورد می‌خواهید، first() کاربرد بیشتری دارد.


# Eloquent Collection چیست؟

وقتی از:


Product::all();

یا:


Product::where('status', true)->get();

استفاده می‌کنیم، معمولاً یک Eloquent Collection دریافت می‌کنیم.

Collection امکانات مختلفی برای پردازش داده‌ها در اختیارمان قرار می‌دهد.

مثلاً:


$products = Product::where('status', true)->get();



$names = $products->pluck('name');

همچنین می‌توان از متدهای مختلف Collection برای فیلتر، تبدیل و پردازش داده‌ها استفاده کرد.


# Pagination در Eloquent

در پروژه‌هایی که تعداد رکوردها زیاد است، دریافت همه داده‌ها معمولاً ایده خوبی نیست.

مثلاً اگر ۱۰۰ هزار محصول داشته باشیم، این Query:


Product::all();

می‌تواند مقدار زیادی داده وارد حافظه برنامه کند.

به‌جای آن می‌توان از Pagination استفاده کرد:


$products = Product::paginate(20);

در این حالت هر صفحه ۲۰ محصول خواهد داشت.

موضوع Pagination در ادامه این کلاستر به‌صورت مستقل بررسی خواهد شد.


# Eloquent و Relationship

یکی از مهم‌ترین قابلیت‌های Eloquent، تعریف ارتباط بین Modelها است.

برای مثال فرض کنید:


User

و:


Order

داریم.

یک کاربر می‌تواند چند سفارش داشته باشد.

در Model کاربر می‌توانیم چنین رابطه‌ای تعریف کنیم:


public function orders()

{

    return $this->hasMany(Order::class);

}

سپس:


$user->orders;

می‌تواند سفارش‌های کاربر را در اختیارمان قرار دهد.

Relationship یکی از مهم‌ترین بخش‌های Eloquent است و در مقاله بعدی به‌صورت کامل بررسی می‌شود.


# Lazy Loading در Eloquent

وقتی رابطه‌ای را فقط زمانی که به آن دسترسی پیدا می‌کنیم بارگذاری کنیم، با مفهوم Lazy Loading مواجه هستیم.

مثلاً:


$user = User::find(1);



$orders = $user->orders;

رابطه زمانی بارگذاری می‌شود که $user->orders مورد استفاده قرار بگیرد.

این قابلیت ساده و کاربردی است، اما در پروژه‌های بزرگ اگر بدون دقت استفاده شود، می‌تواند به مشکل معروف N+1 Query منجر شود.


# Eager Loading در Eloquent

برای جلوگیری از بسیاری از مشکلات مربوط به تعداد Queryها، می‌توانیم از Eager Loading استفاده کنیم.

مثلاً:


$users = User::with('orders')->get();

در این حالت Laravel رابطه orders را به شکل پیش‌بینی‌شده همراه با داده‌های کاربران بارگذاری می‌کند.

Eager Loading یکی از موضوعات مهم بهینه‌سازی Eloquent است و در مقالات تخصصی‌تر این کلاستر باید با جزئیات بیشتری بررسی شود.


# Scope در Eloquent چیست؟

Scope به ما اجازه می‌دهد Queryهای قابل استفاده مجدد را داخل Model تعریف کنیم.

مثلاً فرض کنید مرتباً به محصولات فعال نیاز داریم.

می‌توانیم یک Scope تعریف کنیم:


public function scopeActive($query)

{

    return $query->where('status', true);

}

حالا می‌توانیم بنویسیم:


$products = Product::active()->get();

به این ترتیب منطق Query در قسمت‌های مختلف برنامه تکرار نمی‌شود.


# Cast در Eloquent

گاهی لازم است داده دیتابیس هنگام کار در PHP به نوع مشخصی تبدیل شود.

برای مثال:


protected function casts(): array

{

    return [

        'status' => 'boolean',

        'price' => 'decimal:2',

    ];

}

در این حالت Eloquent هنگام دسترسی به ویژگی‌ها، تبدیل نوع را طبق تنظیمات Model انجام می‌دهد.

Cast برای مواردی مانند:

  • Boolean
  • Integer
  • Decimal
  • Array
  • JSON
  • Date

و انواع داده دیگر کاربرد دارد.


# Accessor و Mutator در Eloquent

Eloquent امکان ایجاد منطق مربوط به خواندن و نوشتن Attributeها را نیز فراهم می‌کند.

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

در نسخه‌های جدید Laravel می‌توان این منطق را با Attribute تعریف کرد.

مثلاً:


use Illuminate\Database\Eloquent\Casts\Attribute;



protected function name(): Attribute

{

    return Attribute::make(

        get: fn ($value) => strtoupper($value),

    );

}

البته بهتر است چنین منطق‌هایی فقط زمانی استفاده شوند که واقعاً بخشی از رفتار Model باشند و منطق پیچیده کسب‌وکار داخل Attributeها قرار نگیرد.


# Eloquent و Factory

Eloquent ارتباط نزدیکی با Factory دارد.

در مقاله قبلی با Factory آشنا شدیم و دیدیم چگونه می‌توان داده‌های تستی ایجاد کرد.

برای مثال:


Product::factory()->count(20)->create();

در این حالت ۲۰ محصول تستی در دیتابیس ایجاد می‌شود.

این قابلیت برای:

  • تست
  • توسعه
  • ایجاد داده اولیه
  • تست Pagination
  • تست Queryها

بسیار کاربردی است.


# Eloquent Model چه زمانی بهتر از Query Builder است؟

Eloquent و Query Builder هر دو ابزارهای قدرتمندی هستند، اما کاربردشان دقیقاً یکسان نیست.

ویژگیEloquentQuery Builder
Model محوربلهخیر
Relationshipبسیار مناسبمحدودتر
خوانایی در CRUDبالابالا
کار با Objectبلهخیر
Queryهای پیچیدهمناسببسیار مناسب
دسترسی مستقیم‌تر به Queryمناسبمناسب
منطق Domain روی Modelبلهخیر

در بسیاری از عملیات معمول پروژه، Eloquent انتخاب طبیعی است.

اما این به معنی آن نیست که همیشه باید از Eloquent استفاده کنیم. برای Queryهای خاص و پیچیده، Query Builder یا حتی SQL خام در شرایط مشخص می‌تواند مناسب‌تر باشد.


# یک مثال کامل از کار با Eloquent

فرض کنید Model زیر را داریم:


class Product extends Model

{

    protected $fillable = [

        'name',

        'price',

        'status',

    ];



    protected function casts(): array

    {

        return [

            'status' => 'boolean',

            'price' => 'decimal:2',

        ];

    }

}

حالا می‌توانیم محصول جدید ایجاد کنیم:


$product = Product::create([

    'name' => 'Laptop Lenovo',

    'price' => 45000000,

    'status' => true,

]);

محصولات فعال را دریافت کنیم:


$products = Product::where('status', true)

    ->latest()

    ->get();

محصول خاصی را پیدا کنیم:


$product = Product::findOrFail(10);

قیمت آن را تغییر دهیم:


$product->update([

    'price' => 47000000,

]);

و در نهایت محصول را حذف کنیم:


$product->delete();

این مثال ساده بخش بزرگی از عملیات روزمره Eloquent را نشان می‌دهد.


# اشتباهات رایج هنگام استفاده از Eloquent

۱. دریافت همه رکوردها بدون نیاز

استفاده از:


Product::all();

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

اگر فقط چند رکورد نیاز دارید، از Query مناسب استفاده کنید:


Product::latest()->limit(20)->get();

یا از Pagination استفاده کنید.


۲. استفاده نادرست از Mass Assignment

اگر $fillable یا تنظیمات Mass Assignment را به‌درستی مدیریت نکنید، ممکن است داده‌هایی که نباید از ورودی کاربر قابل تغییر باشند، در معرض تغییر قرار بگیرند.

فیلدهای قابل مقداردهی را آگاهانه مشخص کنید.


۳. فراموش کردن Validation

Eloquent جایگزین Validation نیست.

این کار:


Product::create($request->all());

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

بهتر است ابتدا داده‌ها اعتبارسنجی شوند و سپس فقط داده‌های معتبر و موردنیاز به Model منتقل شوند.

مثلاً:


$data = $request->validate([

    'name' => ['required', 'string', 'max:255'],

    'price' => ['required', 'numeric'],

]);



Product::create($data);


۴. ایجاد Queryهای N+1

وقتی تعداد زیادی Model دریافت می‌کنیم و سپس داخل یک حلقه به Relationship دسترسی پیدا می‌کنیم، ممکن است تعداد زیادی Query اضافی اجرا شود.

مثلاً:


$users = User::all();



foreach ($users as $user) {

    echo $user->orders->count();

}

در چنین شرایطی باید بررسی کنیم آیا Eager Loading با:


User::with('orders')->get();

مناسب‌تر است یا خیر.


۵. قرار دادن منطق بیش از حد در Model

Model جای مناسبی برای تعریف رفتار مرتبط با داده و Queryهای مربوط به همان Entity است، اما نباید تمام منطق پیچیده کسب‌وکار پروژه را داخل یک Model قرار دهیم.

در پروژه‌های بزرگ، استفاده از Service Layer و معماری مناسب می‌تواند ساختار کد را بهتر کند.


# نکات مهم برای استفاده حرفه‌ای از Eloquent

برای استفاده بهتر از Eloquent در پروژه‌های واقعی، چند نکته اهمیت زیادی دارد:

فقط داده موردنیاز را دریافت کنید

به‌جای:


Product::get();

در صورت نیاز:


Product::select('id', 'name', 'price')->get();

Queryهای تکراری را به Scope تبدیل کنید

اگر یک شرط در چند قسمت استفاده می‌شود، Scope می‌تواند کد را تمیزتر کند.

Relationshipها را با دقت بارگذاری کنید

در پروژه‌های بزرگ، تعداد Queryها اهمیت زیادی دارد.

از Pagination برای لیست‌های بزرگ استفاده کنید

به‌خصوص در:

  • پنل مدیریت
  • فروشگاه
  • گزارش‌ها
  • لیست سفارش‌ها
  • لیست کاربران

ورودی کاربر را مستقیماً به Model نسپارید

ابتدا Validation و سپس Mass Assignment کنترل‌شده انجام دهید.


# تفاوت Eloquent و SQL خام

در SQL خام ممکن است بنویسیم:


SELECT * FROM products

WHERE status = 1

ORDER BY created_at DESC;

در Eloquent:


$products = Product::where('status', true)

    ->latest()

    ->get();

Eloquent کد را با ساختار Model محور Laravel هماهنگ می‌کند و برای بسیاری از عملیات CRUD و Relationshipها بسیار مناسب است.

با این حال، Eloquent قرار نیست تمام SQL را از بین ببرد. توسعه‌دهنده Laravel همچنان باید مفاهیم دیتابیس، SQL، Index، Join، Transaction و بهینه‌سازی Query را بشناسد.


# آیا یادگیری Eloquent برای Laravel ضروری است؟

اگر قصد توسعه جدی با Laravel دارید، یادگیری Eloquent اهمیت زیادی دارد.

چون در بسیاری از پروژه‌های Laravel با مواردی مانند:

  • User
  • Product
  • Order
  • Payment
  • Post
  • Category
  • Invoice
  • Ticket

و Entityهای مختلف سروکار خواهید داشت.

در چنین پروژه‌هایی، Modelها و Queryهای Eloquent بخش مهمی از کد برنامه را تشکیل می‌دهند.

بنابراین بعد از یادگیری Migration، Seeder و Factory، یادگیری Eloquent قدم مهم بعدی برای ورود به بخش جدی‌تر کار با دیتابیس در Laravel است.


# جمع‌بندی

Eloquent ORM یکی از مهم‌ترین بخش‌های Laravel برای کار با دیتابیس است.

با Eloquent می‌توانیم برای جدول‌های دیتابیس Model ایجاد کنیم و عملیات مختلفی مانند:

  • دریافت اطلاعات
  • ایجاد رکورد
  • ویرایش رکورد
  • حذف رکورد
  • فیلتر کردن
  • مرتب‌سازی
  • Pagination
  • تعریف Scope
  • Cast کردن داده‌ها
  • کار با Relationshipها
  • Eager Loading

را با ساختار شیءگرای Laravel انجام دهیم.

برای شروع، مهم‌ترین متدهایی که باید یاد بگیرید عبارت‌اند از:


all()

get()

first()

find()

findOrFail()

where()

orderBy()

latest()

create()

save()

update()

delete()

destroy()

count()

exists()

pluck()

with()

paginate()

اما Eloquent بسیار گسترده‌تر از CRUD ساده است. یکی از مهم‌ترین بخش‌های آن Relationshipها هستند؛ یعنی ارتباط دادن Modelهایی مانند User، Order، Product و Category به یکدیگر.

در مقاله بعدی به سراغ Relationship در Laravel می‌رویم و یاد می‌گیریم چگونه ارتباط بین Modelها را با Eloquent تعریف و استفاده کنیم.


سوالات متداول

Eloquent در Laravel چیست؟

Eloquent سیستم ORM لاراول است که به کمک آن می‌توانیم با استفاده از Modelهای PHP با جداول دیتابیس کار کنیم.

آیا Eloquent همان SQL است؟

خیر. Eloquent یک ORM است که Queryهای موردنیاز را از طریق API شیءگرای Laravel ایجاد می‌کند. با این حال، برای استفاده حرفه‌ای از آن همچنان باید SQL و مفاهیم دیتابیس را بشناسید.

Eloquent Model چیست؟

Model کلاسی در Laravel است که معمولاً نماینده یک جدول دیتابیس است و برای خواندن، ایجاد، ویرایش و حذف داده‌ها استفاده می‌شود.

تفاوت find و findOrFail چیست؟

find() در صورت پیدا نکردن رکورد مقدار null برمی‌گرداند، اما findOrFail() در صورت پیدا نشدن رکورد، خطای مناسب ایجاد می‌کند.

تفاوت get و first چیست؟

get() مجموعه‌ای از نتایج را برمی‌گرداند، در حالی که first() اولین نتیجه را برمی‌گرداند.

fillable در Laravel چه کاربردی دارد؟

$fillable مشخص می‌کند کدام Attributeها اجازه دارند از طریق Mass Assignment مقداردهی شوند.

آیا Eloquent برای پروژه‌های بزرگ مناسب است؟

بله، اما استفاده حرفه‌ای از آن نیازمند توجه به تعداد Queryها، Indexها، Eager Loading، Pagination، N+1 Query و ساختار مناسب دیتابیس است.

آیا برای یادگیری Eloquent باید SQL بلد باشیم؟

برای شروع می‌توان با دانش پایه SQL از Eloquent استفاده کرد، اما برای توسعه حرفه‌ای Laravel، شناخت SQL و مفاهیم دیتابیس بسیار مهم است.

نظرات (0)

نظرات پس از تأیید مدیر نمایش داده می‌شوند

هنوز نظری ثبت نشده است؛ اولین نفر باشید!

مقالات مرتبط

ساخت CMS با Laravel 12؛ آموزش ساخت سیستم مدیریت محتوا از صفر

ساخت CMS با Laravel 12؛ آموزش ساخت سیستم مدیریت محتوا از صفر

۲۴ دقیقه
ساخت فروشگاه اینترنتی با Laravel 12؛ آموزش پروژه‌محور از صفر تا طراحی هسته فروشگاه

ساخت فروشگاه اینترنتی با Laravel 12؛ آموزش پروژه‌محور از صفر تا طراحی هسته فروشگاه

۲۲ دقیقه
ساخت Marketplace با Laravel؛ آموزش طراحی فروشگاه چندفروشندگی

ساخت Marketplace با Laravel؛ آموزش طراحی فروشگاه چندفروشندگی

۲۲ دقیقه
مدیریت Queueهای سنگین در Laravel؛ آموزش پردازش کارهای طولانی

مدیریت Queueهای سنگین در Laravel؛ آموزش پردازش کارهای طولانی

۲۲ دقیقه