إطار Laravel

إعدادات قاعدة البيانات والهجرة

18 دقيقة الدرس 6 من 45

إعدادات قاعدة البيانات والهجرة

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

إعدادات قاعدة البيانات

يدعم Laravel أنظمة قواعد بيانات متعددة بشكل افتراضي: MySQL و PostgreSQL و SQLite و SQL Server. يتم تخزين تكوين قاعدة البيانات في config/database.php ويستخدم متغيرات البيئة من ملف .env الخاص بك.

ملاحظة: احتفظ دائمًا ببيانات اعتماد قاعدة البيانات الحساسة في ملف .env الخاص بك، ولا تقم بإرسالها إلى نظام التحكم في الإصدارات. يجب أن يكون ملف .env مدرجًا في .gitignore الخاص بك.

إعداد اتصال قاعدة البيانات

افتح ملف .env الخاص بك وقم بتكوين اتصال قاعدة البيانات:

# إعدادات MySQL
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=root
DB_PASSWORD=your_password

# إعدادات SQLite (بديل)
DB_CONNECTION=sqlite
DB_DATABASE=/absolute/path/to/database.sqlite

بعد تكوين قاعدة البيانات، اختبر الاتصال عن طريق تشغيل:

php artisan migrate:status

مقدمة إلى الهجرات

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

نصيحة: فكر في الهجرات كجدول زمني لهيكل قاعدة البيانات الخاصة بك. يمكنك التحرك للأمام (الهجرة) أو للخلف (التراجع) خلال هذا الجدول الزمني في أي وقت.

إنشاء أول هجرة لك

استخدم أمر Artisan لإنشاء هجرة جديدة:

# إنشاء هجرة لجدول جديد
php artisan make:migration create_products_table

# إنشاء هجرة لتعديل جدول موجود
php artisan make:migration add_price_to_products_table --table=products

# إنشاء هجرة مع إنشاء مخطط تلقائي
php artisan make:migration create_categories_table --create=categories

ينشئ هذا ملفًا جديدًا في database/migrations/ مع بادئة الطابع الزمني مثل 2026_02_14_120000_create_products_table.php.

هيكل الهجرة

يحتوي كل ملف هجرة على طريقتين: up() و down().

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * تشغيل الهجرات.
     */
    public function up(): void
    {
        Schema::create('products', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->text('description')->nullable();
            $table->decimal('price', 8, 2);
            $table->integer('quantity')->default(0);
            $table->boolean('is_available')->default(true);
            $table->timestamps();
        });
    }

    /**
     * عكس الهجرات.
     */
    public function down(): void
    {
        Schema::dropIfExists('products');
    }
};

منشئ المخططات - أنواع الأعمدة

يوفر منشئ المخططات في Laravel العديد من أنواع الأعمدة لتعريف هيكل قاعدة البيانات الخاصة بك:

// المفاتيح الأساسية
$table->id();                           // UNSIGNED BIGINT تلقائي التزايد
$table->uuid('uuid');                   // عمود UUID

// أعمدة النصوص
$table->string('name', 100);           // VARCHAR مع طول اختياري
$table->text('description');           // عمود TEXT
$table->char('code', 10);              // CHAR بطول ثابت

// الأعمدة الرقمية
$table->integer('votes');              // INTEGER
$table->bigInteger('views');           // BIGINT
$table->decimal('price', 8, 2);        // DECIMAL مع دقة
$table->float('rating', 8, 2);         // FLOAT
$table->double('latitude', 15, 8);     // DOUBLE

// قيم منطقية
$table->boolean('is_active');          // BOOLEAN/TINYINT(1)

// التاريخ والوقت
$table->date('birth_date');            // DATE
$table->time('alarm_time');            // TIME
$table->datetime('created_at');        // DATETIME
$table->timestamp('updated_at');       // TIMESTAMP
$table->timestamps();                   // created_at & updated_at
$table->softDeletes();                  // deleted_at للحذف الناعم

// JSON والمصفوفات
$table->json('options');               // عمود JSON
$table->jsonb('settings');             // JSONB (PostgreSQL)

// ثنائي
$table->binary('photo');               // BLOB

معدلات الأعمدة

تسمح لك المعدلات بإضافة خصائص إضافية للأعمدة:

Schema::create('users', function (Blueprint $table) {
    $table->id();

    // أعمدة قابلة للقيم الفارغة
    $table->string('middle_name')->nullable();

    // قيم افتراضية
    $table->string('status')->default('pending');
    $table->integer('points')->default(0);

    // غير موقع (أرقام موجبة فقط)
    $table->integer('age')->unsigned();

    // قيد فريد
    $table->string('email')->unique();
    $table->string('username')->unique();

    // فهرس لاستعلامات أسرع
    $table->string('last_name')->index();

    // تعليقات
    $table->string('status')->comment('حالة حساب المستخدم');

    // بعد عمود محدد (MySQL)
    $table->string('phone')->after('email');

    // موضع العمود الأول (MySQL)
    $table->string('priority')->first();

    // معدلات متعددة
    $table->string('referral_code', 20)
          ->nullable()
          ->unique()
          ->comment('رمز إحالة المستخدم');

    $table->timestamps();
});
تحذير: لا تعمل جميع المعدلات مع جميع أنظمة قواعد البيانات. على سبيل المثال، after() و first() خاصة بـ MySQL ولن تعمل مع PostgreSQL أو SQLite.

المفاتيح الخارجية والعلاقات

حدد العلاقات بين الجداول باستخدام المفاتيح الخارجية:

Schema::create('orders', function (Blueprint $table) {
    $table->id();

    // مفتاح خارجي - نموذج طويل
    $table->unsignedBigInteger('user_id');
    $table->foreign('user_id')
          ->references('id')
          ->on('users')
          ->onDelete('cascade')
          ->onUpdate('cascade');

    // مفتاح خارجي - نموذج قصير
    $table->foreignId('product_id')
          ->constrained()
          ->onDelete('cascade');

    // مفتاح خارجي مع اسم جدول مخصص
    $table->foreignId('category_id')
          ->constrained('product_categories')
          ->onDelete('set null');

    $table->integer('quantity');
    $table->decimal('total', 10, 2);
    $table->timestamps();
});

تشغيل الهجرات

نفذ هجراتك لإنشاء هيكل قاعدة البيانات:

# تشغيل جميع الهجرات المعلقة
php artisan migrate

# تشغيل الهجرات مع بيانات البذور
php artisan migrate --seed

# التراجع عن آخر دفعة من الهجرات
php artisan migrate:rollback

# التراجع عن عدد محدد من الدفعات
php artisan migrate:rollback --step=3

# التراجع عن جميع الهجرات
php artisan migrate:reset

# التراجع عن الكل وإعادة تشغيل الهجرات
php artisan migrate:refresh

# التراجع عن الكل وإعادة التشغيل والبذر
php artisan migrate:refresh --seed

# إسقاط جميع الجداول وإعادة تشغيل الهجرات
php artisan migrate:fresh

# إظهار حالة الهجرة
php artisan migrate:status
ملاحظة: في الإنتاج، استخدم php artisan migrate بعناية. قم دائمًا بعمل نسخة احتياطية من قاعدة البيانات الخاصة بك قبل تشغيل الهجرات التي تعدل الجداول الموجودة.

تعديل الجداول الموجودة

قم بإنشاء هجرة لتعديل جدول موجود:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up(): void
    {
        Schema::table('products', function (Blueprint $table) {
            // إضافة أعمدة جديدة
            $table->string('sku')->unique()->after('name');
            $table->integer('discount')->default(0)->after('price');

            // تعديل عمود موجود
            $table->text('description')->nullable()->change();

            // إعادة تسمية عمود
            $table->renameColumn('quantity', 'stock_quantity');

            // حذف عمود
            $table->dropColumn('is_available');

            // إضافة فهرس
            $table->index('sku');

            // إضافة مفتاح خارجي
            $table->foreignId('category_id')
                  ->nullable()
                  ->constrained()
                  ->onDelete('set null');
        });
    }

    public function down(): void
    {
        Schema::table('products', function (Blueprint $table) {
            $table->dropForeign(['category_id']);
            $table->dropColumn(['sku', 'discount', 'category_id']);
            $table->renameColumn('stock_quantity', 'quantity');
            $table->boolean('is_available')->default(true);
        });
    }
};
تحذير: لتعديل الأعمدة، تحتاج إلى تثبيت حزمة Doctrine DBAL: composer require doctrine/dbal
تمرين 1: إنشاء هجرة مدونة

قم بإنشاء هجرة لجدول posts بالهيكل التالي:

  • id (مفتاح أساسي)
  • user_id (مفتاح خارجي لجدول المستخدمين)
  • category_id (مفتاح خارجي لجدول الفئات، قابل للقيم الفارغة)
  • title (نص، بحد أقصى 200 حرف)
  • slug (نص، فريد)
  • excerpt (نص، قابل للقيم الفارغة)
  • content (نص)
  • featured_image (نص، قابل للقيم الفارغة)
  • views (عدد صحيح، افتراضي 0)
  • is_published (قيمة منطقية، افتراضي false)
  • published_at (طابع زمني، قابل للقيم الفارغة)
  • timestamps (created_at, updated_at)
  • حذف ناعم (deleted_at)

استخدم أنواع الأعمدة والمعدلات وقيود المفاتيح الخارجية المناسبة.

تمرين 2: فهارس قاعدة البيانات

قم بإنشاء هجرة لإضافة فهارس إلى جدول posts:

  • فهرس واحد على slug
  • فهرس مركب على user_id و is_published
  • فهرس نص كامل على title و content (MySQL فقط)

تذكر تضمين طريقة down() لإسقاط هذه الفهارس.

تمرين 3: هجرة جدول محوري

قم بإنشاء هجرة لعلاقة متعدد إلى متعدد بين posts و tags:

  • اسم الجدول: post_tag
  • مفاتيح خارجية: post_id و tag_id
  • يجب أن يكون كلا المفتاحين الخارجيين متتاليين عند الحذف
  • أضف فهرس مركب فريد على كلا العمودين
  • أضف طوابع زمنية

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

  • هجرات ذرية: يجب أن تركز كل هجرة على تغيير واحد. لا تجمع تغييرات متعددة غير مرتبطة.
  • هجرات قابلة للعكس: قم دائمًا بتنفيذ طريقة down() حتى يمكن التراجع عن الهجرات.
  • الاختبار محليًا: اختبر الهجرات دائمًا على قاعدة البيانات المحلية قبل تشغيلها في الإنتاج.
  • النسخ الاحتياطي للإنتاج: قم دائمًا بعمل نسخة احتياطية من قاعدة بيانات الإنتاج قبل تشغيل الهجرات.
  • استخدام المعاملات: يلف Laravel الهجرات في معاملات تلقائيًا (في قواعد البيانات المدعومة).
  • اصطلاحات التسمية: استخدم أسماء هجرات وصفية: create_posts_table، add_featured_to_posts.

الخلاصة

في هذا الدرس، تعلمت:

  • كيفية تكوين اتصالات قاعدة البيانات في Laravel
  • إنشاء وهيكلة ملفات الهجرة
  • استخدام منشئ المخططات مع أنواع الأعمدة المختلفة
  • تطبيق معدلات الأعمدة للقيود والخصائص
  • تعريف علاقات المفاتيح الخارجية
  • تشغيل والتراجع عن وإدارة الهجرات
  • تعديل الجداول الموجودة بأمان

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