زينة العمري نشر 13 مايو أرسل تقرير نشر 13 مايو مرحبا سؤالي هل ممكن اخلي مشروع اللارافل يتصل باكثر من قاعدة بيانات وكيف أحقق هالشي؟؟ 3 اقتباس
1 Ali Ibrahim12 نشر 13 مايو أرسل تقرير نشر 13 مايو قبل البدء بالتفاصيل التقنية، لنتكلم قليلا لماذا ومتى نحتاج إلى اتصالات قاعدة بيانات متعددة في تطبيق Laravel الخاص بنا ؟ - تطبيق مبدأ فصل الاهتمام: فغالباً ما تنتمي البيانات المختلفة إلى مجالات أو خدمات مختلفة. - تحسين الأداء: من خلال توزيع بياناتك عبر قواعد بيانات متعددة، يمكنك تحسين أداء قاعدة البيانات. فعلى سبيل المثال، يقوم البعض باستخدام قاعدة بيانات مخصصة للعمليات الثقيلة للقراءة وأخرى للعمليات الثقيلة للكتابة. - عمليات تكامل الجهات الخارجية: في بعض الأحيان، قد تحتاج إلى الاتصال بقواعد بيانات خارجية أو قديمة لا تتوافق مع مخطط قاعدة البيانات الأساسية. تمكنك الاتصالات المتعددة من العمل مع مصادر البيانات هذه بكفاءة. - في تطبيقات التي تقدم خدمة بالاجار تسمى SAAS وخاصة في حالة تريد فصل بيانات المستخدمين عن بعضهم البعض حيث تكون الواجهة واحدة ولكن بقواعد بيانات مخصصة لكل عميل حيث تسمى هذه الهيكلية بMulti-Tenancy والآن سأقوم بشرح الخطوات لتحقيق ذلك: 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 اقتباس
1 Najah Alsaker نشر 13 مايو أرسل تقرير نشر 13 مايو نعم ذلك ممكن عن طريق اجراء بعض التعديلات في ملف 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 Khaled Osama3 نشر 13 مايو أرسل تقرير نشر 13 مايو نعم، في إمكانك توصيل مشروع لارافل بأكثر من قاعدة بيانات بكل سهولة. ساشرح لك الخطوات بالتفصيل: 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'; 1 اقتباس
0 زينة العمري نشر 14 مايو الكاتب أرسل تقرير نشر 14 مايو بتاريخ 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 والآن سأقوم بشرح الخطوات لتحقيق ذلك: 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(); وهنا يتولى لارافل مهمة توجيه استعلاماتك إلى قاعدة البيانات الصحيحة بناء على خاصية اتصال النموذج التي قمنا بوضها في كل نموذج. شكراً على توضيح الدوافع لهذا الأمر والشرح الرائع اقتباس
السؤال
زينة العمري
مرحبا
سؤالي هل ممكن اخلي مشروع اللارافل يتصل باكثر من قاعدة بيانات
وكيف أحقق هالشي؟؟
4 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.