إنشاء واستخدام العلاقات في Laravel Eloquent

Amine
30/08/2024

المقدمة

العلاقات (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 لتحسين إدارة العلاقات بين البيانات في تطبيقاتك.

التعليقات

اترك تعليقاً