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();
أفضل الممارسات
- حمّل العلاقات مشتاقاً دائماً في الحلقات
- استخدم
withCountبدلاً من العد اليدوي - استخدم
whenLoadedفي API Resources - استخدم
chunkأوcursorللبيانات الكبيرة - عرف العلاقة العكسية دائماً
- استخدم morph maps للأنواع polymorphic