تصویر مرتبط

در بعضی موارد نیاز داریم چند دیتابیس را به اپلیکیشن لاراول خود مرتبط کنیم. حالا در این مقاله می‌خواهیم نحوه پیاده سازی ارتباط چند دیتابیس در لاراول 5.7 را بررسی کنیم. برای ایجاد ارتباط میان چند دیتابیس و اپلیکیشن لاراول خود، باید یک پروژه لاراول جدید نصب کرده و نمونه‌ای که در ادامه می‌آید را پیاده سازی کنید.

مراحل ارتباط چند دیتابیس در لاراول

پیکربندی دیتابیس بدون .env

در لاراول، فایل پیکربندی دیتابیس در “config/database.php” قرار دارد. در اینجا، می‌توانیم بیش از یک ارتباط از هر نوعی برای دیتابیس ایجاد کنیم. اگر اپلیکیشن شما از داده‌های حاصل از دو دیتابیس مختلف MySql استفاده می‌کند، در این صورت می‌توانید آن‌ها را به آسانی تعریف کنید:

<?php
return => [
    'connections' => [
        // Default database connection
        'mysql' => [
            'driver' => 'mysql',
            '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' => '',
            'strict' => true,
            'engine' => null,
        ],
        // Custom database connection
        'mysql2' => [
            'driver' => 'mysql',
            'host' => 'localhost',
            'port' => '3306',
            'database' => 'lara_multiple',
            'username' => 'root',
            'password' => '',
            'unix_socket' => '',
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],
    ]
]

پیکربندی دیتابیس با .env

با تکه کد زیر، “config/database.php” خود را به روز رسانی کنید:

<?php
return => [
    'connections' => [
        // Custom database connection
        'mysql2' => [
            'driver'    => env('DB_CONNECTION_SECOND'),
            'host'      => env('DB_HOST_SECOND'),
            'port'      => env('DB_PORT_SECOND'),
            'database'  => env('DB_DATABASE_SECOND'),
            'username'  => env('DB_USERNAME_SECOND'),
            'password'  => env('DB_PASSWORD_SECOND'),
            ...
        ],
    ]
]

پس از آپدیت باید کد زیر را به فایل .env خود اضافه کنید:

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

ایجاد ارتباط سفارشی در مایگریشن

می‌توانید از نمونه زیر جهت استفاده از ارتباط سفارشی در مایگریشن خود استفاده کنید:

<?php
...
public function up()
{
    Schema::connection('mysql2')->create('multipost', function (Blueprint $table) {
        $table->increments('id');
        $table->string('post_title');
        $table->string('post_content');
        $table->timestamps();
    });
}
...

پس از ایجاد زمان مایگریشن جهت اجرای مایگریشن‌ها برای ایجاد ارتباط خاص در دیتابیس، باید به صورت زیر عمل کنید:

php artisan migrate --database=mysql2

گاهی زمان اجرای فرمان مایگریشن با پیغام خطایی مانند این رو به رو می‌شویم:

ارتباط چند دیتابیس در لاراول

شما می‌توانید این نوع مشکلات را با استفاده از فرمان آرتیسان “config:cache” حل کنید:

php artisan config:cache

ارتباط سفارشی با مدل

متغیر “$connection” را در مدل خود ایجاد کنید:

<?php
class SomeModel extends Eloquent {
    protected $connection = 'mysql2';
}

ارتباط سفارشی با کنترلر

می‌توانید با استفاده از متد “setConnection” ارتباطی در کنترلر ایجاد کنید:

<?php
class SomeController extends BaseController
{
    public function someMethod()
    {
        $someModel = new SomeModel;
        $someModel->setConnection('mysql2');
        $something = $someModel->find(1);
        return $something;
    }
}

ارتباط سفارشی با Query Builder

می‌توانید یک ارتباط هم برای query builder ایجاد کنید:

DB::connection('mysql2')->select(...)->(...);