پرش به محتوا

کار با بیش از یک دیتابیس در لاراول ۵

بعضی وقتا نیازه که شما با بیش از یک دیتابیس در ارتباط باشید در لاراول ، مثلا ممکنه برای هر وبلاگی که توی سیستم وبلاگ دهی شما ایجاد میشه یک دیتابیس درست کنید(البته فک نکنم تو این مورد ، این کار معقول باشه) اونجا نیاز هست که در اولین قدم توی فایل config/database.php  کانکشن مربوط به این کار رو ایجاد کنید. بصورت پیشفرض ۴ کانکشن در لاراول ۵ تعریف شده که میتونید شما هم کانکشن دیگه ای برای استفاده تعریف کنید.

تعریف کانکشن برای اتصال به بیش از یک دیتابیس

'mysql2' => [
            'driver'    => 'mysql',
            'host'      => env('DB_EXT_HOST', 'localhost'),
            'database'  => env('DB_EXT_DATABASE', 'db2'),
            'username'  => env('DB_EXT_USERNAME', 'username'),
            'password'  => env('DB_EXT_PASSWORD', 'password'),
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'strict'    => false,
        ],

توی کد بالا ما کانکشن mysql2  رو تعریف کردیم. دقت داشته باشید که کد بالا باید درون connectios تعریف کنید. همچنین توی ریشه اصلی پروژه و توی فایل .env  هم کانکشن باید مشخص شه… اون فایل رو ادیت کنید و مقادیر دلخواهتون رو اضافه کنید :

DB_EXT_HOST=localhost
DB_EXT_DATABASE=db2
DB_EXT_USERNAME=username
DB_EXT_PASSWORD=password

حالا کانکشن های شما آماده هستند و میتونید به روشی که در ادامه میگم از اونها استفاده کنید.

تغییر کانکشن پیشفرض در لاراول

برای اینکه در کل پروژه کانکشن پیشفرض رو تغییر بدیم ، در فایل config/database.php  مقدار ‘default’ => ‘mysql’,  رو به ‘default’ => ‘mysql2’,  تغییر میدیم. در این صورت در کل پروژه شما mysql2 بعنوان کانکشن دیفالت استفاده خواهد شد.

استفاده از یک کانکشن در یک مدل خاص

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

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

از این پس تمام اتصالاتی که با مدل بالا به دیتابیس وصل میشه با کانکشن mysql2 خواهد بود.

تغییر کانکشن در کنترلر

شاید بخواید جزئی تر شید و بخواید درون یک کنترلر خاص کانکشن رو عوض کنید . برای اینکار به راحتی از روش زیر اشتفاده کنید :

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

همونطور که میبینید با استفاده از متد setConnection()  این کار شدنیه…

و استفاده در Query Builder :

برای استفاده از کانکشن دیگه توی کوئوری بیلدر هم بصورت زیر عمل میکنیم :

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

همونطور که میبینید لاراول بصورت خیلی شیک و تمیز کار شما رو راه میندازه و نیاز به اضافه کاری نیست.

امیدوارم به دردتون خورده باشم 🙂

3 دیدگاه دربارهٔ «کار با بیش از یک دیتابیس در لاراول ۵»

  1. سلام مطالب وبلاگت جالب و عالی بود
    من سه تا سایت سه زبانه دارم بدلایلی مجبور شدم هر سه تا رو جداگانه راه اندازی کنم تو ساب دومین ولی مشکلی که بعدا پیش اومد یادم نبود سیستم چون رزروی هست اکانت ها باید در هر سه زبان یکی باشه و کلی دردسر کشیدم اومدم توی زبان فارسی که اصلی بود وقتی اکانتی ایجاد میشد توی زبانه های دیگه هم این بشه تا اینجا مشکلی نبود فقط مشکل این بود که اگه توی زبان های دوم توی ذخیره مشکلی پیش میاومد اولی ذخیره میشد و بقیه نه و id جداول بهم میریخت و درست رزرو انجام نمیشد
    راه حلی هست بتونم اینو درست کنم

    سوال دوم
    توی حالت تغییر کانکشن در کنترلر من میخوام همزمان سه تا کانکشن داشته باشم یعنی توی سه تا دیتابیس ذخیره کنم این مورد چطوری میشه؟

    1. سوال اولتونو کامل متوجه نشدم و نیاز به توضیح بیشتر هست… تا جایی که من میدونم میشه یه سشن رو توی ساب دامین ها شیر کرد… و از اون میشه ربان رو خوند و…

      برای هر دیتابیسی که دارید میتونید کانکشن تعریف کنید و تک تک بهشون وصل شید و کارتون رو انجام بدید… میتونه هرچنتا دیتابیس باشه . ولی اگه میخواید با یه حرکت، توی هر سه تا ذخیره کنید… اینو من تا حالا کار نکردم و نمیدونم.

  2. من میخوام بین چند تا دیتابیس که هر کدوم توی یک سیستم(لپتاپ) مختلف هستند ارتباط برقرار کنم و تبادل اطلاعات کنم
    پیشنهادی ندارین؟

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *