بی آکادمی
آموزش پایتون
هوش مصنوعی
دانلود و نصب لینوکس
داکر دسکتاپ
VS Code
آموزش لاراول
گیت و گیت هاب
آموزش HTML
آموزش CSS
فلکس باکس
جاوااسکریپت
TypeScript
فروشگاه اینترنتی
اپلیکیشن موبایل
آموزش اکسل
آموزش SQL
آموزش MySQL
آموزش PHP

آموزش جامع مدل‌ها و 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

این دستور دو فایل ایجاد می‌کند:

  1. مدل Post در app/Models/Post.php
  2. مایگریشن مربوطه در 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
// در مدل User
public function posts()
{
return $this->hasMany(Post::class);
}
// در مدل Post
public function user()
{
return $this->belongsTo(User::class);
}

2. رابطه چند به چند (Many to Many)

php
// در مدل Post
public function tags()
{
return $this->belongsToMany(Tag::class);
}
// در مدل Tag
public function posts()
{
return $this->belongsToMany(Post::class);
}

3. رابطه یک به یک (One to One)

php
// در مدل User
public function profile()
{
return $this->hasOne(Profile::class);
}
// در مدل Profile
public function user()
{
return $this->belongsTo(User::class);
}

📌 Scopeها در Eloquent

Scopeها به شما امکان می‌دهند کوئری‌های پراستفاده را در مدل کپسوله کنید:

php
// تعریف scope در مدل Post
public 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) . ' تومان';
}
}

راهنمای تمرین:

  1. مدل Product را با فیلدهای name, price, stock ایجاد کنید
  2. رابطه belongsTo با مدل Category تعریف کنید
  3. یک scope برای دریافت محصولات موجود (stock > 0) ایجاد کنید
  4. یک accessor برای نمایش قیمت با فرمت مناسب بسازید

📌 نکات پیشرفته Eloquent

  • Soft Delete: برای حذف موقت رکوردها
  • Events: اجرای کد در رویدادهای مختلف مدل (مثلاً پس از ذخیره)
  • Eager Loading: برای حل مشکل N+1 در روابط
  • Query Scopes: برای استفاده مجدد از شرایط کوئری
  • Polymorphic Relations: برای روابط چندشکلی

📌 قدم بعدی

در درس بعدی با مایگریشن‌ها و سیدرها در لاراول آشنا خواهیم شد!