البرمجة

كيفية إنشاء نموذج في Laravel

كيفية إنشاء نموذج (Model) في Laravel: دليل شامل ومفصل

يعتبر إطار العمل Laravel من أكثر أُطر تطوير الويب شهرةً وانتشاراً في عالم PHP، ويرجع ذلك إلى سهولة استخدامه، مرونته، وقوته في بناء تطبيقات الويب الحديثة. من أهم المفاهيم التي يعتمد عليها Laravel هو مفهوم النماذج (Models)، والتي تمثل الطريقة التي يتفاعل بها التطبيق مع قواعد البيانات بشكل مباشر. النموذج هو الطبقة المسؤولة عن التعامل مع البيانات، والتحكم في قواعد البيانات، وإنشاء علاقة بين البيانات داخل التطبيق.

في هذا المقال، سنناقش بتفصيل مطول وموسع كيفية إنشاء نموذج في Laravel، مع شرح مفصل لكل خطوة ومفهوم يرتبط بها، مع التركيز على أفضل الممارسات وكيفية تحقيق أقصى استفادة من النماذج في إطار Laravel.


1. مفهوم النموذج (Model) في Laravel

النموذج في Laravel هو تمثيل لكائن أو جدول في قاعدة البيانات. عند استخدام النموذج، يقوم Laravel تلقائيًا بربطه بجدول في قاعدة البيانات بحيث يمكن تنفيذ عمليات CRUD (إنشاء، قراءة، تحديث، حذف) بسهولة. في الأساس، كل نموذج يرتبط بجدول واحد، وكل سجل في الجدول يُمثّل بواسطة كائن من النموذج.

تعتمد نماذج Laravel على تقنية Eloquent ORM، وهي اختصار لـ Object-Relational Mapping، أي الربط بين قواعد البيانات والنماذج بشكل كائنات برمجية. من خلال Eloquent، يمكنك استخدام طرق برمجية سهلة للتعامل مع البيانات بدلاً من كتابة استعلامات SQL معقدة يدويًا.


2. إعداد بيئة العمل لإنشاء نموذج في Laravel

قبل البدء بإنشاء النموذج، يجب أن تكون البيئة جاهزة للعمل. لذلك، تأكد من التالي:

  • وجود نسخة من Laravel مثبتة على جهازك.

  • وجود قاعدة بيانات مفعّلة ومتصلة بمشروع Laravel.

  • إعداد ملف .env ليحتوي على إعدادات الاتصال بقاعدة البيانات مثل:

env
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=database_name DB_USERNAME=root DB_PASSWORD=password

بعد التأكد من إعداد قاعدة البيانات، يمكن الانتقال لإنشاء النموذج.


3. كيفية إنشاء نموذج (Model) في Laravel

3.1 الأمر الأساسي لإنشاء نموذج

لإنشاء نموذج جديد في Laravel، يتم استخدام أمر artisan الخاص بـ Laravel، وهو أداة سطر الأوامر التي تسهل العديد من المهام، بما في ذلك إنشاء النماذج.

الأمر الأساسي لإنشاء نموذج هو:

bash
php artisan make:model ModelName

مثال:

bash
php artisan make:model Post

هذا الأمر سينشئ ملف نموذج باسم Post.php داخل مجلد app/Models (في Laravel 8 والإصدارات الأحدث)، أو في مجلد app إذا كنت تستخدم إصدارًا أقدم.


3.2 إنشاء نموذج مع ملف هجرة (Migration)

عادة ما يتم إنشاء النموذج مع ملف هجرة (Migration) لتسهيل إنشاء جدول مخصص في قاعدة البيانات. يمكن إنشاء النموذج مع ملف الهجرة باستخدام الأمر:

bash
php artisan make:model Post -m

المفتاح -m أو --migration يعني إنشاء ملف هجرة مرتبط بالنموذج.

بعد تنفيذ الأمر، ستجد ملف الهجرة داخل مجلد database/migrations والذي يمكنك تعديله لتعريف بنية الجدول.


3.3 إنشاء نموذج مع ملف مصنع بيانات (Factory) ومصادر أخرى

Laravel يسمح لك بإنشاء نموذج مع ملفات مساعدة أخرى مثل factory، seeder، controller، وغيرها عبر مفاتيح الأمر، مثل:

bash
php artisan make:model Post -mfsc

شرح مفاتيح الأمر:

  • -m : إنشاء ملف هجرة (Migration).

  • -f : إنشاء ملف مصنع بيانات (Factory).

  • -s : إنشاء ملف Seeder.

  • -c : إنشاء ملف Controller.

استخدام هذه الخيارات مفيد جداً لتسريع تطوير التطبيق.


4. تركيب نموذج Laravel

بعد إنشاء النموذج، يظهر داخل مجلد app/Models (حسب الإصدار)، وهو ملف PHP يحتوي على كلاس يمثل الجدول في قاعدة البيانات.

php
namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Post extends Model { use HasFactory; }

4.1 الشرح التفصيلي:

  • namespace App\Models; تحدد مكان النموذج داخل المشروع.

  • use Illuminate\Database\Eloquent\Model; يرث النموذج من الكلاس الأساسي Model الذي يوفر وظائف ORM.

  • use HasFactory; يتيح استخدام مصانع البيانات.


4.2 ربط النموذج بجدول قاعدة البيانات

بشكل افتراضي، Laravel يربط نموذج Post بجدول باسم posts (أي جمع اسم النموذج وتحويله إلى صيغة الجمع).

إذا أردت ربط النموذج بجدول مختلف، يمكنك تحديد اسم الجدول في خاصية $table داخل الكلاس:

php
protected $table = 'my_custom_table';

4.3 تحديد المفاتيح الأساسية (Primary Key)

افتراضيًا، يفترض Laravel أن المفتاح الأساسي في الجدول هو عمود باسم id.

إذا كان المفتاح الأساسي مختلفًا، يمكن تحديده باستخدام خاصية $primaryKey:

php
protected $primaryKey = 'post_id';

4.4 تعطيل الطابع الزمني (Timestamps)

Laravel يفترض وجود عمودين في الجدول هما created_at و updated_at لإدارة تاريخ الإنشاء والتحديث.

إذا كان الجدول لا يحتوي على هذه الأعمدة، يمكن تعطيل هذه الميزة:

php
public $timestamps = false;

4.5 التحكم في الحقول التي يمكن ملؤها (Mass Assignment)

عند استخدام التخصيص الجماعي (Mass Assignment)، يجب تعريف الحقول التي يمكن ملؤها أو التي لا يمكن ملؤها:

  • تعريف الحقول القابلة للملء باستخدام $fillable:

php
protected $fillable = ['title', 'content', 'author_id'];
  • أو تعطيل الحماية من التخصيص الجماعي باستخدام $guarded:

php
protected $guarded = [];

5. استخدام النموذج للتفاعل مع قاعدة البيانات

النموذج هو الوسيط الأساسي لتنفيذ العمليات على البيانات، وهنا بعض الأمثلة العملية:

5.1 إنشاء سجل جديد

php
$post = new Post(); $post->title = 'عنوان المقال'; $post->content = 'محتوى المقال التفصيلي...'; $post->author_id = 1; $post->save();

أو باستخدام التخصيص الجماعي:

php
Post::create([ 'title' => 'عنوان المقال', 'content' => 'محتوى المقال التفصيلي...', 'author_id' => 1, ]);

5.2 قراءة البيانات

  • قراءة جميع السجلات:

php
$posts = Post::all();
  • قراءة سجل معين بواسطة المفتاح الأساسي:

php
$post = Post::find(1);
  • استخدام شروط معقدة:

php
$posts = Post::where('author_id', 1)->orderBy('created_at', 'desc')->get();

5.3 تحديث سجل

php
$post = Post::find(1); $post->title = 'العنوان الجديد'; $post->save();

5.4 حذف سجل

php
$post = Post::find(1); $post->delete();

6. العلاقات بين النماذج

النماذج في Laravel تسمح بإنشاء علاقات بين الجداول بطرق سهلة وواضحة، أهمها:

  • علاقة واحد إلى واحد (One to One)

  • علاقة واحد إلى متعدد (One to Many)

  • علاقة متعدد إلى متعدد (Many to Many)

  • علاقة التوريث (Polymorphic Relations)

6.1 مثال علاقة واحد إلى متعدد

في نموذج User:

php
public function posts() { return $this->hasMany(Post::class); }

وفي نموذج Post:

php
public function user() { return $this->belongsTo(User::class); }

هذه العلاقات تسهل التعامل مع البيانات المرتبطة بكفاءة.


7. طرق متقدمة في النماذج

7.1 استخدام السمات Accessors و Mutators

يمكن تعديل طريقة الحصول على القيم أو تخزينها في النموذج باستخدام Accessors و Mutators.

مثال Accessor لتحويل العنوان إلى حروف كبيرة:

php
public function getTitleAttribute($value) { return strtoupper($value); }

مثال Mutator لتخزين العنوان بعد تنظيفه:

php
public function setTitleAttribute($value) { $this->attributes['title'] = trim($value); }

7.2 النطاقات Scopes

النطاقات هي طرق لتحديد شروط مكررة يمكن إعادة استخدامها بسهولة في الاستعلامات.

مثال:

php
public function scopePublished($query) { return $query->where('is_published', true); }

الاستخدام:

php
$posts = Post::published()->get();

7.3 تحميل العلاقات مع النموذج

لتقليل عدد الاستعلامات، يمكن تحميل العلاقات مسبقًا باستخدام with:

php
$posts = Post::with('user')->get();

8. إدارة ملفات الهجرة (Migrations) الخاصة بالنموذج

بعد إنشاء النموذج مع ملف الهجرة، يجب تعديل ملف الهجرة لتعريف بنية الجدول.

مثال على ملف هجرة لنموذج Post:

php
public function up() { Schema::create('posts', function (Blueprint $table) { $table->id(); $table->string('title'); $table->text('content'); $table->foreignId('author_id')->constrained('users')->onDelete('cascade'); $table->timestamps(); }); }

ثم تنفيذ الهجرة باستخدام:

bash
php artisan migrate

9. خلاصة حول إنشاء نموذج في Laravel

  • النموذج هو جسر بين التطبيق وقاعدة البيانات.

  • يتم إنشاؤه عبر أمر php artisan make:model.

  • من الأفضل ربطه بملف هجرة لتحديد بنية الجدول.

  • يمكن تخصيص النموذج بتحديد الجدول، المفتاح الأساسي، والحقول القابلة للملء.

  • يدعم Laravel إنشاء علاقات متعددة بين النماذج لتعزيز إدارة البيانات.

  • يوفر ميزات متقدمة مثل Accessors, Mutators, وScopes لتحسين التعامل مع البيانات.

  • استخدام النموذج مع ملفات الهجرة ومصانع البيانات يسهل عمليات التطوير والاختبار.


10. جدول ملخص لأهم خصائص نموذج Laravel

الخاصية/الطريقة الوصف الاستخدام النموذجي
$table تحديد اسم الجدول في قاعدة البيانات protected $table = 'my_table';
$primaryKey تحديد المفتاح الأساسي للجدول protected $primaryKey = 'user_id';
$timestamps تعطيل أو تفعيل الأعمدة الزمنية public $timestamps = false;
$fillable تحديد الحقول القابلة للتعبئة الجماعية

Retry