كيفية تشغيل Laravel باستخدام اتصالات قاعدة بيانات متعددة

في الآونة الأخيرة كنت أبحث عن Laravel باستخدام اتصال قاعدة بيانات متعددة. كنت مهتمة بكيفية التعامل مع Eloquent العلاقة إذا كان نموذج آخر يستخدم اتصال مختلف أو كيفية التعامل مع باني الاستعلام عملية الصلة إذا كان جدول آخر في قاعدة بيانات أخرى.

حسنًا ، لنبدأ.

TL، DR

لا أحب قراءة مجموعة من القصص؟ فقط اذهب إلى الكود:

تثبيت Laravel

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

انتظر حتى الانتهاء من التقدم ونحن على استعداد لإعداد قاعدة البيانات الخاصة بنا.

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

سأستخدم 3 قواعد بيانات مختلفة ومحركان مختلفان لقواعد البيانات باستخدام MySQL & SQL Server للبحث هل من الممكن أو لا تشغيل نموذج الاستعلام أو العلاقة عبر قاعدة بيانات مختلفة أو حتى محرك قاعدة البيانات.

  1. قاعدة بيانات laramultidb مع اسم اتصال mysql يستخدم محرك MySQL.
  2. قاعدة بيانات laramultidb2 مع اسم الاتصال mysql2 يستخدم محرك MySQL.
  3. قاعدة بيانات laravelmultidb مع اسم الاتصال sqlsrv يستخدم SQL Server Engine.

إذا لم يكن لديك SQL Server ، فيمكنك استخدام محرك قاعدة بيانات آخر مثل PostgreSQL أو Sqlite.

انتقل إلى config / database.php لإنشاء تكوين اتصال قاعدة بيانات جديد. في هذه الحالة ، هذا هو الإعداد الخاص بي

'اتصالات' => ​​[

    'sqlite' => [
        'driver' => 'sqlite' ،
        'database' => env ('DB_DATABASE' ، database_path ('database.sqlite')) ،
        "البادئة" => '' ،
    ]،

    'mysql' => [
        'driver' => 'mysql' ،
        'host' => env ('DB_HOST' ، '127.0.0.1') ،
        'port' => env ('DB_PORT'، '3306') ،
        'database' => env ('DB_DATABASE' ، 'صياغة') ،
        'اسم المستخدم' => env ('DB_USERNAME' ، 'صياغة') ،
        'password' => env ('DB_PASSWORD'، '')،
        'unix_socket' => env ('DB_SOCKET'، '')،
        'charset' => 'utf8mb4' ،
        'collation' => 'utf8mb4_unicode_ci' ،
        "البادئة" => '' ،
        "صارم" => صحيح ،
        'المحرك' => لاغٍ ،
    ]،

    'mysql2' => [
        'driver' => 'mysql' ،
        'host' => env ('DB_HOST' ، '127.0.0.1') ،
        'port' => env ('DB_PORT'، '3306') ،
        'database' => env ('DB_DATABASE2' ، 'صياغة') ،
        'اسم المستخدم' => env ('DB_USERNAME' ، 'صياغة') ،
        'password' => env ('DB_PASSWORD'، '')،
        'unix_socket' => env ('DB_SOCKET'، '')،
        'charset' => 'utf8mb4' ،
        'collation' => 'utf8mb4_unicode_ci' ،
        "البادئة" => '' ،
        "صارم" => صحيح ،
        'المحرك' => لاغٍ ،
    ]،
    'sqlsrv' => [
        'driver' => 'sqlsrv' ،
        'host' => env ('DB_HOST_SQLSRV' ، 'localhost') ،
        'port' => env ('DB_PORT_SQLSRV' ، '1433') ،
        'database' => env ('DB_DATABASE_SQLSRV'، 'forge') ،
        'اسم المستخدم' => env ('DB_USERNAME_SQLSRV' ، 'صياغة') ،
        'password' => env ('DB_PASSWORD_SQLSRV'، '')،
        'charset' => 'utf8' ،
        "البادئة" => '' ،
    ]،

]،

نظرًا لأن mysql2 يستخدم محرك قاعدة البيانات نفسه والمضيف نفسه مثل mysql ، فسوف أترك تكوين mysql الآخر مثل اتصال mysql باستثناء DB_DATABASE2 لأنني استخدمت اسم قاعدة بيانات مختلفة.

ثم أحتاج إلى ضبط معلمات env لتكوين sqlsrv باستخدام مفتاح جديد حتى أتمكن من ملء بيانات اعتماد SQL Server في ملف .env الخاص بي لاحقًا.

اتصال قاعدة البيانات جاهز ، قم الآن بتعديل ملف .env في قسم قاعدة البيانات.

DB_CONNECTION = ك
DB_HOST = 127.0.0.1
DB_PORT = 3306
DB_DATABASE = laramultidb
DB_USERNAME = هو yourusername
DB_PASSWORD = سر

DB_DATABASE2 = laramultidb2

DB_HOST_SQLSRV = 127.0.0.1
DB_PORT_SQLSRV = 1433
DB_DATABASE_SQLSRV = laravelmultidb
DB_USERNAME_SQLSRV = سا
DB_PASSWORD_SQLSRV = سر

لاحظ أنه في ملف .env الخاص بي ، DB_CONNECTION = mysql هو الاتصال الافتراضي.

الهجرة والنموذج

كيف يمكننا إنشاء الترحيل بالضبط بناءً على الاتصال الذي نريده؟ بسيطة ، وتحديد اسم الاتصال في المخطط الخاص بك. دعنا نلقي نظرة على الترحيل الخاص بي باستخدام اتصال قاعدة البيانات غير الافتراضي:

/ **
 * تشغيل الهجرات.
 *
 @ عودة باطلة
 * /
وظيفة عامة تصل ()
{
    مخطط :: اتصال ('mysql2') -> إنشاء ('أنواع' ، وظيفة (جدول مخطط $) {
        $ table-> الزيادات ( 'الهوية')؛
        $ table-> سلسلة ( 'كود') -> مؤشر ()؛
        $ table-> سلسلة ( 'اسم')؛
        $ table-> الطوابع ()؛
    })؛
}

/ **
 * عكس الهجرات.
 *
 @ عودة باطلة
 * /
وظيفة عامة أسفل ()
{
    مخطط :: الاتصال ( 'mysql2') -> قطرة ( 'أنواع')؛
}

في الحالة أعلاه ، عند تشغيل الترحيل ، سيتم ترحيل جدول الأنواع إلى اتصال mysql2 الذي يستخدم laravmultidb2 كاسم قاعدة بيانات. إذا لم نحدد اسم الاتصال المحدد ، فسيستخدم laravel الاتصال الافتراضي.

ماذا عن الفصيح كنموذج؟ ما عليك سوى تحديد اسم الاتصال في نموذج Eloquent لتجاوز الاتصال الافتراضي.

<؟ PHP

مساحة التطبيق

استخدام Illuminate \ Database \ Eloquent \ Model؛

نوع الطبقة يمتد النموذج
{
    اتصال $ محمي = 'mysql2' ؛
}

علاقة قواعد بيانات متعددة

الآن نحن نعرف بالفعل أنه يمكننا تحديد الاتصال في نموذج Eloquent. سحر Eloquent هو أنه يمكننا كتابة العلاقات بين النموذج الذي لديه اتصال مختلف.

لقد كتبت ثلاثة نماذج لها اتصال مختلف:

النوع (اتصال: mysql2) له العديد من النشرات (اتصال: mysql)

نوع (اتصال: mysql2) لديه العديد من البريد (اتصال: sqlsrv)

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

فيما يلي مثال على نموذج النوع:

<؟ PHP

مساحة التطبيق

استخدام Illuminate \ Database \ Eloquent \ Model؛

نوع الطبقة يمتد النموذج
{
    اتصال $ محمي = 'mysql2' ؛

    / **
     * واحد إلى العديد من العلاقات مع بوست (اتصال mysql)
     * @ عودة \ إلقاء الضوء \ قاعدة بيانات \ بليغة \ العلاقات \ HasMany
     * /
    الوظائف العامة ()
    {
        return $ this-> hasMany (Post :: class، 'type_code'، 'code')؛
    }

    / **
     * واحد إلى العديد من العلاقات مع البريد (اتصال sqlsrv)
     * @ عودة \ إلقاء الضوء \ قاعدة بيانات \ بليغة \ العلاقات \ HasMany
     * /
    رسائل البريد العامة ()
    {
        return $ this-> hasMany (Mail :: class، 'type_code'، 'code')؛
    }
}

ثم هذا هو نموذج بريدنا الذي يحتوي على تشابه الكود مع نموذج النشر:

<؟ PHP

مساحة التطبيق

استخدام Illuminate \ Database \ Eloquent \ Model؛

الطبقة البريد يمتد النموذج
{
    اتصال $ محمي = 'sqlsrv' ؛

    / **
     * تجاوز تنسيق التاريخ لأن خادم SQL لديه تنسيق التاريخ الخاص بحقول الطابع الزمني
     * سلسلة فار
     * /
    محمية $ dateFormat = 'Y-m-d H: i: s'؛

    / **
     * واحد إلى العديد من علاقة الانعكاس مع Type (اتصال mysql2)
     * @ عودة \ إلقاء الضوء \ قاعدة بيانات \ بليغة \ العلاقات \ BelongsTo
     * /
    نوع الوظيفة العامة ()
    {
        return $ this-> ينتمي إلى (Type :: class، 'type_code'، 'code')؛
    }
}

الآن ، نظرًا لأننا قمنا بالفعل بوضع بياناتنا في دمية ، فيمكننا اختبار علاقتنا باستخدام العبث

تحقق علاقة اتصال متعددة باستخدام العبث

الآن نرى Type type الذي يتصل باتصال mysql2 قادرًا على الحصول على علاقة مع Post والتي تتصل بـ mysql و Mail والتي تتصل بـ sqlsrv.

نفس القاعدة عندما ينتمي أسلوب العلاقة إلى علاقة متعددة.

اتصال متعددة باستخدام طريقة علاقة تنتمي إلى

تاريخ العملية

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

الانضمام إلى الاستعلام مع اتصال mysql و mysql2

ولكن إذا لم نحدد اسم قاعدة البيانات لجدول الأنواع ، فسيحدث خطأ:

جدول الخطأ غير موجود

بدلاً من ذلك باستخدام نموذج Eloquent ، يستطيع Query Builder أيضًا تشغيل عملية الربط

الانضمام باستخدام باني الاستعلام

أو يمكننا تحديد اتصال من باني الاستعلام:

الاستعلام باني الانضمام مع اسم الاتصال المحدد

بعد ذلك ، نريد التحقق من استعلام الانضمام من البريد الذي يحتوي على اتصال sqlsrv (SQL Server) والنوع الذي يحتوي على اتصال mysql2 (MySQL).

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

خاتمة

  1. Laravel لديه القدرة على تشغيل في اتصال قاعدة بيانات متعددة حتى في عبر محرك قاعدة بيانات مختلفة.
  2. يمكننا إنشاء الترحيل استنادًا إلى الاتصال الذي قمنا به من قبل.
  3. يمتلك ORMquent ORM القدرة على تشغيل العلاقة مع اتصال مختلف ، لكننا بحاجة إلى تجاوز سمة الاتصال لتحديد أي اتصال يتم استخدامه بواسطة الطراز.
  4. Query Builder هو دعم استعلام الانضمام في اتصال مختلف ولكنه محدود بنفس محرك المضيف / قاعدة البيانات. لم أتمكن من العثور على كيفية الانضمام عبر محرك قاعدة بيانات مختلف حتى الآن.
  5. في الحالة الحقيقية ، على الرغم من أن علاقة الدعم Eloquent بمحرك قاعدة بيانات مختلفة ، أعتقد أن المشكلة قد تحدث حول التوافق في الاستعلام الخاص بك لأن هناك بعض النهج المختلفة عندما نقوم بتشغيل الاستعلام بين محرك قاعدة البيانات.
  6. لقد اختتم هذا الموضوع بمشروع بسيط في جيثب. لا تتردد في استنساخ أو تعديل ما تحتاج إليه.

المراجع

الناس الترميز سعيد :)