اذهب إلى المحتوى

السؤال

Recommended Posts

  • 1
نشر

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

- في تطبيقات التي تقدم خدمة بالاجار تسمى SAAS  وخاصة في حالة تريد فصل بيانات المستخدمين عن بعضهم البعض حيث تكون الواجهة واحدة ولكن بقواعد بيانات مخصصة لكل عميل حيث تسمى هذه الهيكلية بMulti-Tenancy

818560441_.png.585be48c5363417b0b0ad23e02b6a44c.png

والآن سأقوم بشرح الخطوات لتحقيق ذلك:
1. يجب إعداد قواعد البيانات التي أريد التعامل معها: لإعداد اتصالات قاعدة بيانات متعددة نحتاج لتعريف كل اتصال منها في ملف config/database.php:

// config/database.php
'connections' => [
    'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'default'),
        'username' => env('DB_USERNAME', 'default'),
        'password' => env('DB_PASSWORD', ''),
        // ...
    ],
    'second_db' => [
        'driver' => 'mysql',
        'host' => env('SECOND_DB_HOST', '127.0.0.1'),
        'port' => env('SECOND_DB_PORT', '3306'),
        'database' => env('SECOND_DB_DATABASE', 'second'),
        'username' => env('SECOND_DB_USERNAME', 'second'),
        'password' => env('SECOND_DB_PASSWORD', ''),
        // ...
    ],
    // يمكنك الإضافة بقدر ما تشائين من الاتصالات بقواعد البيانات هنا
],

في هذا المثال، حددنا اتصالين بقاعدة البيانات: "mysql" (الاتصال الافتراضي) و"second_db". يمكنك إضافة المزيد من الاتصالات كما هو مطلوب، ولكل منها تكوينها الخاص.2. تعيين متغيرات البيئة: للحفاظ على أمان بيانات الوصول لقاعدة البيانات، يجب الالتزام باستخدم ملف .env لتخزينها. لذلك يجب تعيين متغيرات البيئة لكل اتصال قاعدة بيانات قمنا بانشائه كما يلي:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=your_database
DB_USERNAME=your_username
DB_PASSWORD=your_password

SECOND_DB_CONNECTION=mysql
SECOND_DB_HOST=127.0.0.1
SECOND_DB_PORT=3306
SECOND_DB_DATABASE=second_database
SECOND_DB_USERNAME=second_username
SECOND_DB_PASSWORD=second_password


وتأكد من تطابق أسماء متغيرات البيئة مع تلك المعرفة في config/database.php.
3. نقوم بإنشاء النماذج (models):
مثلاً هنا سأقوم بإنشاء نموذج لكل قاعدة بيانات:

php artisan make:model User -m
php artisan make:model Product -m


يقوم هذا الأمر بإنشاء ملفات النموذج وملفات الترحيل (migrations) لكل نموذج.
4. تحديد الاتصال في ملفات النموذج التي تم إنشاؤها:

// app/Models/User.php
protected $connection = 'mysql';
// app/Models/Product.php
protected $connection = 'second_db';

5. تشغيل عمليات الترحيل (migrate)
الآن، يمكنك تشغيل عمليات الترحيل لكل اتصال على حدة:

php artisan migrate
php artisan migrate --database=second_db

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

use App\Models\User;
use App\Models\Product;

// Retrieve users from the 'mysql' database
$users = User::all();

// Retrieve products from the 'second_db' database
$products = Product::all();


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

  • 1
نشر

نعم ذلك ممكن عن طريق اجراء بعض التعديلات في ملف config/database.php بحيث ان كل نموذج Model من نماذج لارافيل يحتوي على الخاصية connection والتي عادة ما تكون مظبوطة على قاعدة البيانات الافتراضية المضمنة 

الان ستقوم باضافة تعريف لقاعدة البيانات الموجودة لديك كالتالي 

'sqlite2' => [
    'driver' => 'sqlite',
    'database' => env('DB_DATABASE', database_path('database.sqlite')),
    'prefix' => '',
],

sqlite  هو اسم قاعدة البيانات يمكنك استبدالها بالاسم الموجود لديك 

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

$users = DB::connection('sqlite2')->select(...);

والان سنقوم باسنادها كقيمة ل connection في ملف النموذج المستهدف

class User extends Model
{
    protected $connection = 'sqlite2';
}

وبالتوفيق لك ...

  • 1
نشر

نعم، في إمكانك توصيل مشروع لارافل بأكثر من قاعدة بيانات بكل سهولة. ساشرح لك الخطوات بالتفصيل:
1. تعديل ملف الإعدادات .env:
   - أول شئ ستفعله هي إضافة إعدادات الاتصال للقواعد البيانات المختلفة في ملف .env الخاص بمشروعك. مثلاً، لو عندك قاعدتين بيانات، واحدة اسمها db1 والتانية db2، هتضيف إعدادات زي الأتي:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=main_database
DB_USERNAME=root
DB_PASSWORD=

DB_CONNECTION_SECOND=mysql
DB_HOST_SECOND=127.0.0.1
DB_PORT_SECOND=3306
DB_DATABASE_SECOND=second_database
DB_USERNAME_SECOND=root
DB_PASSWORD_SECOND=

2. تعديل ملف config/database.php:
   - بعد ما تضيف الإعدادات في .env، الان يجب الذهاب لملف config/database.php عشان تضيف الاتصالات الجديدة تحت الـ connections array:

'mysql' => [
    'driver' => 'mysql',
    'url' => env('DATABASE_URL'),
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'unix_socket' => env('DB_SOCKET', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'prefix_indexes' => true,
    'strict' => true,
    'engine' => null,
    'options' => extension_loaded('pdo_mysql') ? array_filter([
        PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
    ]) : [],
],

'second' => [
    'driver' => 'mysql',
    'url' => env('DATABASE_URL_SECOND'),
    'host' => env('DB_HOST_SECOND', '127.0.0.1'),
    'port' => env('DB_PORT_SECOND', '3306'),
    'database' => env('DB_DATABASE_SECOND', 'forge'),
    'username' => env('DB_USERNAME_SECOND', 'forge'),
    'password' => env('DB_PASSWORD_SECOND', ''),
    'unix_socket' => env('DB_SOCKET_SECOND', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'prefix_indexes' => true,
    'strict' => true,
    'engine' => null,
    'options' => extension_loaded('pdo_mysql') ? array_filter([
        PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA_SECOND'),
    ]) : [],
],

3. استخدام الاتصال بالقاعدة المطلوبة في كودك:

يمكنك صنع جدول لقاعدة البيانات عبر Schema بحيث نعرف Schema::connection لقاعدة البيانات الأخرى مثل 

Schema::connection('second')->create('users_two', function($table)
{
    $table->increments('id'):
});

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

$users = DB::connection('second')->select(...);

ايضا يمكنك توجيه Model إلى استخدام قاعدة الاتصال الثاني الخاص بقاعدة البيانات الثانية باستخدام 

protected $connection = 'second';
  • 0
نشر
بتاريخ On 13‏/5‏/2024 at 13:02 قال Najah Alsaker:

نعم ذلك ممكن عن طريق اجراء بعض التعديلات في ملف config/database.php بحيث ان كل نموذج Model من نماذج لارافيل يحتوي على الخاصية connection والتي عادة ما تكون مظبوطة على قاعدة البيانات الافتراضية المضمنة 

الان ستقوم باضافة تعريف لقاعدة البيانات الموجودة لديك كالتالي 

'sqlite2' => [
    'driver' => 'sqlite',
    'database' => env('DB_DATABASE', database_path('database.sqlite')),
    'prefix' => '',
],

sqlite  هو اسم قاعدة البيانات يمكنك استبدالها بالاسم الموجود لديك 

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

$users = DB::connection('sqlite2')->select(...);

والان سنقوم باسنادها كقيمة ل connection في ملف النموذج المستهدف

class User extends Model
{
    protected $connection = 'sqlite2';
}

وبالتوفيق لك ...

شكراً جزيلاً لك

بتاريخ On 13‏/5‏/2024 at 13:03 قال Khaled Osama3:

نعم، في إمكانك توصيل مشروع لارافل بأكثر من قاعدة بيانات بكل سهولة. ساشرح لك الخطوات بالتفصيل:
1. تعديل ملف الإعدادات .env:
   - أول شئ ستفعله هي إضافة إعدادات الاتصال للقواعد البيانات المختلفة في ملف .env الخاص بمشروعك. مثلاً، لو عندك قاعدتين بيانات، واحدة اسمها db1 والتانية db2، هتضيف إعدادات زي الأتي:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=main_database
DB_USERNAME=root
DB_PASSWORD=

DB_CONNECTION_SECOND=mysql
DB_HOST_SECOND=127.0.0.1
DB_PORT_SECOND=3306
DB_DATABASE_SECOND=second_database
DB_USERNAME_SECOND=root
DB_PASSWORD_SECOND=

2. تعديل ملف config/database.php:
   - بعد ما تضيف الإعدادات في .env، الان يجب الذهاب لملف config/database.php عشان تضيف الاتصالات الجديدة تحت الـ connections array:

'mysql' => [
    'driver' => 'mysql',
    'url' => env('DATABASE_URL'),
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'unix_socket' => env('DB_SOCKET', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'prefix_indexes' => true,
    'strict' => true,
    'engine' => null,
    'options' => extension_loaded('pdo_mysql') ? array_filter([
        PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
    ]) : [],
],

'second' => [
    'driver' => 'mysql',
    'url' => env('DATABASE_URL_SECOND'),
    'host' => env('DB_HOST_SECOND', '127.0.0.1'),
    'port' => env('DB_PORT_SECOND', '3306'),
    'database' => env('DB_DATABASE_SECOND', 'forge'),
    'username' => env('DB_USERNAME_SECOND', 'forge'),
    'password' => env('DB_PASSWORD_SECOND', ''),
    'unix_socket' => env('DB_SOCKET_SECOND', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'prefix_indexes' => true,
    'strict' => true,
    'engine' => null,
    'options' => extension_loaded('pdo_mysql') ? array_filter([
        PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA_SECOND'),
    ]) : [],
],

3. استخدام الاتصال بالقاعدة المطلوبة في كودك:

يمكنك صنع جدول لقاعدة البيانات عبر Schema بحيث نعرف Schema::connection لقاعدة البيانات الأخرى مثل 

Schema::connection('second')->create('users_two', function($table)
{
    $table->increments('id'):
});

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

$users = DB::connection('second')->select(...);

ايضا يمكنك توجيه Model إلى استخدام قاعدة الاتصال الثاني الخاص بقاعدة البيانات الثانية باستخدام 

protected $connection = 'second';

شكراً لحضرتك على جهدك وشرحك

بتاريخ On 13‏/5‏/2024 at 13:03 قال Ali Ibrahim12:

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

- في تطبيقات التي تقدم خدمة بالاجار تسمى SAAS  وخاصة في حالة تريد فصل بيانات المستخدمين عن بعضهم البعض حيث تكون الواجهة واحدة ولكن بقواعد بيانات مخصصة لكل عميل حيث تسمى هذه الهيكلية بMulti-Tenancy

818560441_.png.585be48c5363417b0b0ad23e02b6a44c.png

والآن سأقوم بشرح الخطوات لتحقيق ذلك:
1. يجب إعداد قواعد البيانات التي أريد التعامل معها: لإعداد اتصالات قاعدة بيانات متعددة نحتاج لتعريف كل اتصال منها في ملف config/database.php:

// config/database.php
'connections' => [
    'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'default'),
        'username' => env('DB_USERNAME', 'default'),
        'password' => env('DB_PASSWORD', ''),
        // ...
    ],
    'second_db' => [
        'driver' => 'mysql',
        'host' => env('SECOND_DB_HOST', '127.0.0.1'),
        'port' => env('SECOND_DB_PORT', '3306'),
        'database' => env('SECOND_DB_DATABASE', 'second'),
        'username' => env('SECOND_DB_USERNAME', 'second'),
        'password' => env('SECOND_DB_PASSWORD', ''),
        // ...
    ],
    // يمكنك الإضافة بقدر ما تشائين من الاتصالات بقواعد البيانات هنا
],

في هذا المثال، حددنا اتصالين بقاعدة البيانات: "mysql" (الاتصال الافتراضي) و"second_db". يمكنك إضافة المزيد من الاتصالات كما هو مطلوب، ولكل منها تكوينها الخاص.2. تعيين متغيرات البيئة: للحفاظ على أمان بيانات الوصول لقاعدة البيانات، يجب الالتزام باستخدم ملف .env لتخزينها. لذلك يجب تعيين متغيرات البيئة لكل اتصال قاعدة بيانات قمنا بانشائه كما يلي:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=your_database
DB_USERNAME=your_username
DB_PASSWORD=your_password

SECOND_DB_CONNECTION=mysql
SECOND_DB_HOST=127.0.0.1
SECOND_DB_PORT=3306
SECOND_DB_DATABASE=second_database
SECOND_DB_USERNAME=second_username
SECOND_DB_PASSWORD=second_password


وتأكد من تطابق أسماء متغيرات البيئة مع تلك المعرفة في config/database.php.
3. نقوم بإنشاء النماذج (models):
مثلاً هنا سأقوم بإنشاء نموذج لكل قاعدة بيانات:

php artisan make:model User -m
php artisan make:model Product -m


يقوم هذا الأمر بإنشاء ملفات النموذج وملفات الترحيل (migrations) لكل نموذج.
4. تحديد الاتصال في ملفات النموذج التي تم إنشاؤها:

// app/Models/User.php
protected $connection = 'mysql';
// app/Models/Product.php
protected $connection = 'second_db';

5. تشغيل عمليات الترحيل (migrate)
الآن، يمكنك تشغيل عمليات الترحيل لكل اتصال على حدة:

php artisan migrate
php artisan migrate --database=second_db

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

use App\Models\User;
use App\Models\Product;

// Retrieve users from the 'mysql' database
$users = User::all();

// Retrieve products from the 'second_db' database
$products = Product::all();


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

شكراً على توضيح الدوافع لهذا الأمر والشرح الرائع

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...