آموزش جامع مدلها و Eloquent ORM در لاراول
🎯 اهداف یادگیری
- آشنایی با مفاهیم پایه مدلها در لاراول
- یادگیری نحوه تعریف و استفاده از Eloquent ORM
- کار با روابط بین مدلها
- استفاده از Scopeها و Mutatorها
- انجام عملیات CRUD با Eloquent
📌 مدلها در لاراول چیست؟
مدلها نماینده جداول دیتابیس در لاراول هستند و با استفاده از Eloquent ORM با آنها کار میکنیم:
php
namespace App\Models;use Illuminate\Database\Eloquent\Model;class User extends Model{ // نام جدول مربوط به این مدل protected $table = 'users'; // فیلدهای قابل پر شدن (Mass Assignment) protected $fillable = ['name', 'email', 'password']; // فیلدهای مخفی شده (مثلاً پسورد) protected $hidden = ['password', 'remember_token'];}
ویژگیهای کلیدی مدلها:
- ارتباط با دیتابیس: هر مدل نماینده یک جدول در دیتابیس است
- امنیت: حفاظت در برابر Mass Assignment با $fillable و $guarded
- انعطافپذیری: امکان تعریف روابط، scopeها و متدهای سفارشی
📌 ایجاد و استفاده از مدلها
برای ایجاد یک مدل جدید از دستور آرتیزان استفاده میکنیم:
bash
php artisan make:model Post -m
این دستور دو فایل ایجاد میکند:
- مدل Post در
app/Models/Post.php
- مایگریشن مربوطه در
database/migrations/...
(به خاطر فلگ -m)
مثال عملی با مدل Post:
php
// ایجاد یک پست جدید$post = Post::create([ 'title' => 'اولین پست من', 'body' => 'این محتوای اولین پست من است.', 'published_at' => now()]);// دریافت تمام پستهای منتشر شده$publishedPosts = Post::where('published_at', '<=', now()) ->orderBy('published_at', 'desc') ->get();
📌 روابط در Eloquent
Eloquent از روابط مختلفی پشتیبانی میکند که مهمترین آنها عبارتند از:
1. رابطه یک به چند (One to Many)
php
// در مدل Userpublic function posts(){ return $this->hasMany(Post::class);}// در مدل Postpublic function user(){ return $this->belongsTo(User::class);}
2. رابطه چند به چند (Many to Many)
php
// در مدل Postpublic function tags(){ return $this->belongsToMany(Tag::class);}// در مدل Tagpublic function posts(){ return $this->belongsToMany(Post::class);}
3. رابطه یک به یک (One to One)
php
// در مدل Userpublic function profile(){ return $this->hasOne(Profile::class);}// در مدل Profilepublic function user(){ return $this->belongsTo(User::class);}
📌 Scopeها در Eloquent
Scopeها به شما امکان میدهند کوئریهای پراستفاده را در مدل کپسوله کنید:
php
// تعریف scope در مدل Postpublic function scopePublished($query){ return $query->where('published_at', '<=', now());}// استفاده از scope$publishedPosts = Post::published()->get();
انواع Scope:
- Local Scope: همانند مثال بالا که با scope شروع میشود
- Global Scope: برای اعمال شرایط به تمام کوئریهای مدل
- Dynamic Scope: scopeهایی که پارامتر میپذیرند
📌 Mutator و Accessor
برای تغییر مقدار فیلدها هنگام ذخیرهسازی (Mutator) یا بازیابی (Accessor) استفاده میشوند:
php
// Accessor - وقتی مقدار فیلد را میخوانیدpublic function getTitleAttribute($value){ return ucfirst($value);}// Mutator - وقتی مقدار فیلد را ست میکنیدpublic function setTitleAttribute($value){ $this->attributes['title'] = strtolower($value);}
مثال عملی:
php
// ایجاد پست با عنوان "Hello World"$post = Post::create(['title' => 'Hello World']);// در دیتابیس ذخیره میشود: 'hello world'// هنگام خواندن نمایش داده میشود: 'Hello world'
📌 عملیات CRUD با Eloquent
مهمترین عملیات پایگاه داده با Eloquent:
1. ایجاد رکورد (Create)
php
// روش اول$post = new Post();$post->title = 'عنوان پست';$post->body = 'متن پست';$post->save();// روش دوم (Mass Assignment)$post = Post::create([ 'title' => 'عنوان پست', 'body' => 'متن پست']);
2. خواندن رکوردها (Read)
php
// دریافت تمام رکوردها$posts = Post::all();// دریافت یک رکورد با id$post = Post::find(1);// دریافت اولین رکورد مطابق شرط$post = Post::where('published', true)->first();
3. بهروزرسانی رکوردها (Update)
php
// روش اول$post = Post::find(1);$post->title = 'عنوان جدید';$post->save();// روش دوم (Mass Assignment)Post::where('id', 1)->update(['title' => 'عنوان جدید']);
4. حذف رکوردها (Delete)
php
// روش اول$post = Post::find(1);$post->delete();// روش دومPost::destroy(1);// روش سوم (حذف چند رکورد)Post::where('published', false)->delete();
📌 تمرین عملی
مدل Product را با ویژگیهای زیر پیادهسازی کنید:
php
class Product extends Model{ // فیلدهای قابل پر شدن protected $fillable = ['name', 'price', 'stock']; // رابطه با مدل Category (هر محصول یک دستهبندی دارد) public function category() { return $this->belongsTo(Category::class); } // Scope برای دریافت محصولات موجود public function scopeAvailable($query) { return $query->where('stock', '>', 0); } // Accessor برای نمایش قیمت با فرمت مناسب public function getFormattedPriceAttribute() { return number_format($this->price) . ' تومان'; }}
راهنمای تمرین:
- مدل Product را با فیلدهای name, price, stock ایجاد کنید
- رابطه belongsTo با مدل Category تعریف کنید
- یک scope برای دریافت محصولات موجود (stock > 0) ایجاد کنید
- یک accessor برای نمایش قیمت با فرمت مناسب بسازید
📌 نکات پیشرفته Eloquent
- Soft Delete: برای حذف موقت رکوردها
- Events: اجرای کد در رویدادهای مختلف مدل (مثلاً پس از ذخیره)
- Eager Loading: برای حل مشکل N+1 در روابط
- Query Scopes: برای استفاده مجدد از شرایط کوئری
- Polymorphic Relations: برای روابط چندشکلی
📌 قدم بعدی
در درس بعدی با مایگریشنها و سیدرها در لاراول آشنا خواهیم شد!