العودة للمقالات
2026-07-05 Abdelrhman Yasser

علاقات Eloquent: الدليل الكامل

علاقات Eloquent: من الأساسيات إلى الأنماط المتقدمة

مدة القراءة: 35 دقيقة

مقدمة

Eloquent ORM هو جوهرة Laravel — تطبيق Active Record معبر بشكل جميل يحول تفاعلات قاعدة البيانات إلى PHP طبيعية. في قلبه العلاقات، التي تحول المفاتيح الخارجية وجداول الربط إلى رسوم بيانية كائنية سهلة الاستخدام.

أنواع العلاقات

واحد لواحد (One-to-One)

class User extends Model
{
    public function profile(): HasOne
    {
        return $this->hasOne(Profile::class);
    }
}

class Profile extends Model
{
    public function user(): BelongsTo
    {
        return $this->belongsTo(User::class);
    }
}

واحد لكثير (One-to-Many)

class Post extends Model
{
    public function comments(): HasMany
    {
        return $this->hasMany(Comment::class);
    }
}

كثير لكثير (Many-to-Many)

class User extends Model
{
    public function roles(): BelongsToMany
    {
        return $this->belongsToMany(Role::class)
            ->withTimestamps()
            ->withPivot('assigned_by', 'expires_at');
    }
}

العمليات على الجدول المحوري:

  • attach() — إضافة علاقة
  • detach() — إزالة علاقة
  • sync() — مزامنة المصفوفة بالكامل
  • toggle() — تبديل العلاقة
  • updateExistingPivot() — تحديث بيانات العمود المحوري

علاقات Polymorphic

class Comment extends Model
{
    public function commentable(): MorphTo
    {
        return $this->morphTo();
    }
}

class Post extends Model
{
    public function comments(): MorphMany
    {
        return $this->morphMany(Comment::class, 'commentable');
    }
}

مشكلة N+1

// ❌ N+1 استعلام
$posts = Post::all();
foreach ($posts as $post) {
    echo $post->author->name; // 1 + N استعلام
}

// ✅ تحميل مشتاق — استعلامان فقط
$posts = Post::with('author')->get();

أفضل الممارسات

  1. حمّل العلاقات مشتاقاً دائماً في الحلقات
  2. استخدم withCount بدلاً من العد اليدوي
  3. استخدم whenLoaded في API Resources
  4. استخدم chunk أو cursor للبيانات الكبيرة
  5. عرف العلاقة العكسية دائماً
  6. استخدم morph maps للأنواع polymorphic

مقالات ذات صلة

# Laravel# PHP# Eloquent# Database# ORM# Relationships
WhatsApp
تواصل عبر واتساب