إنشاء واستخدام العلاقات في Laravel Eloquent
المقدمة
العلاقات (Relationships) في Laravel Eloquent هي طريقة لربط الجداول ببعضها البعض، مما يسهل التعامل مع البيانات المرتبطة. باستخدام Eloquent، يمكنك تعريف العلاقات بين النماذج بطرق مختلفة، مثل One-to-One، One-to-Many، Many-to-Many، وPolymorphic. في هذا الدليل، سنتعلم كيفية إنشاء واستخدام هذه العلاقات في Laravel Eloquent.
الخطوة 1: تعريف علاقة One-to-One
علاقة One-to-One تعني أن كل سجل في الجدول الأول مرتبط بسجل واحد في الجدول الثاني. لنقم بتعريف علاقة One-to-One بين جدول User
وجدول Profile
:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
use HasFactory;
public function profile()
{
return $this->hasOne(Profile::class);
}
}
وفي نموذج Profile
، نعرّف العلاقة بالعكس باستخدام belongsTo
:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Profile extends Model
{
use HasFactory;
public function user()
{
return $this->belongsTo(User::class);
}
}
الآن يمكنك جلب الملف الشخصي المرتبط بالمستخدم والعكس باستخدام:
$user = User::find(1);
$profile = $user->profile; // جلب الملف الشخصي للمستخدم
$profile = Profile::find(1);
$user = $profile->user; // جلب المستخدم للملف الشخصي
الخطوة 2: تعريف علاقة One-to-Many
علاقة One-to-Many تعني أن كل سجل في الجدول الأول يمكن أن يكون مرتبطًا بالعديد من السجلات في الجدول الثاني. لنقم بتعريف علاقة One-to-Many بين جدول Post
وجدول Comment
:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
use HasFactory;
public function comments()
{
return $this->hasMany(Comment::class);
}
}
وفي نموذج Comment
، نعرّف العلاقة بالعكس باستخدام belongsTo
:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Comment extends Model
{
use HasFactory;
public function post()
{
return $this->belongsTo(Post::class);
}
}
الآن يمكنك جلب التعليقات المرتبطة بمقال والعكس باستخدام:
$post = Post::find(1);
$comments = $post->comments; // جلب جميع التعليقات المرتبطة بالمقال
$comment = Comment::find(1);
$post = $comment->post; // جلب المقال المرتبط بالتعليق
الخطوة 3: تعريف علاقة Many-to-Many
علاقة Many-to-Many تعني أن كل سجل في الجدول الأول يمكن أن يكون مرتبطًا بالعديد من السجلات في الجدول الثاني، والعكس صحيح. لنقم بتعريف علاقة Many-to-Many بين جدول Student
وجدول Course
:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Student extends Model
{
use HasFactory;
public function courses()
{
return $this->belongsToMany(Course::class);
}
}
وفي نموذج Course
، نعرّف العلاقة بالعكس باستخدام belongsToMany
:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Course extends Model
{
use HasFactory;
public function students()
{
return $this->belongsToMany(Student::class);
}
}
الآن يمكنك جلب الدورات المرتبطة بطالب والعكس باستخدام:
$student = Student::find(1);
$courses = $student->courses; // جلب جميع الدورات المرتبطة بالطالب
$course = Course::find(1);
$students = $course->students; // جلب جميع الطلاب المرتبطين بالدورة
الخطوة 4: تعريف علاقة Polymorphic
العلاقات المتعددة الأشكال (Polymorphic) تسمح لنموذج واحد أن يكون له علاقات مع نماذج متعددة باستخدام مفتاح واحد. لنقم بتعريف علاقة Polymorphic بين Photo
ونماذج Product
وUser
:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Photo extends Model
{
use HasFactory;
public function imageable()
{
return $this->morphTo();
}
}
في نماذج Product
وUser
، نعرّف العلاقة باستخدام morphMany
:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
use HasFactory;
public function photos()
{
return $this->morphMany(Photo::class, 'imageable');
}
}
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
use HasFactory;
public function photos()
{
return $this->morphMany(Photo::class, 'imageable');
}
}
الآن يمكنك جلب الصور المرتبطة بمنتج أو مستخدم باستخدام:
$product = Product::find(1);
$photos = $product->photos; // جلب جميع الصور المرتبطة بالمنتج
$user = User::find(1);
$photos = $user->photos; // جلب جميع الصور المرتبطة بالمستخدم
الخاتمة
العلاقات في Laravel Eloquent توفر طريقة قوية ومرنة للتعامل مع البيانات المرتبطة في قواعد البيانات. من خلال استخدام أنواع العلاقات المختلفة مثل One-to-One، One-to-Many، Many-to-Many، وPolymorphic، يمكنك بناء تطبيقات معقدة تعمل بكفاءة وتعالج البيانات بشكل متكامل. استمر في استكشاف المزيد من ميزات Laravel لتحسين إدارة العلاقات بين البيانات في تطبيقاتك.
اترك تعليقاً