如何在laravel项目中使用多个数据库连接?

时间:2016-10-15 10:34:11

标签: mysql mongodb database-connection environment laravel-5.3

我想在我的laravel项目中使用mysql和mongoDB,我知道我可以在database.php文件中定义多个连接数组,并将它们称为:

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

但我的问题是如何在项目中将mongoDB和mysql并排使用?

这里真正的问题是.env文件,因为它只使用一个数据库配置。

所以让我为你清楚这是laravel v5.3中我的database.php文件:

 'connections' => [

        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', 'localhost'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'iranad'),
            'username' => env('DB_USERNAME', 'root'),
            'password' => env('DB_PASSWORD', 'mysql'),
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],

        'mongodb' => [
            'driver' => 'mongodb',
            'host' => env('DB_HOST', 'localhost'),
            'port' => env('DB_PORT', '27017'),
            'database' => env('DB_DATABASE'),
            'username' => env('DB_USERNAME'),
            'password' => env('DB_PASSWORD'),
            'options' => [
                'database' => 'admin'
            ]
        ],

    ],

这是我的.env文件:

APP_ENV=local
APP_KEY=base64:NN3Me+qA1UOfdYW2SQyAXtxODazCAYBAKfFdRAqcakg=
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=http://localhost

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

BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_DRIVER=smtp
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

PUSHER_APP_ID=
PUSHER_KEY=
PUSHER_SECRET=

正如您所看到的,我的默认数据库连接是mysql,而.env文件配置设置为mysql,现在如何在我的应用程序中使用mongoDB?

仅供参考:我希望mysql是默认连接,在某些情况下我使用mongodb。

1 个答案:

答案 0 :(得分:0)

感谢@astroanu

,我找到了解决方案

您可以更改默认的env变量名称,它不会破坏您的应用程序的功能

您可以将database.php更改为以下内容:

'connections' => [
    'mysql' => [
        'driver' => 'mysql',
        'host' => env('MYSQL_DB_HOST', 'localhost'),
        'port' => env('MYSQL_DB_PORT', '3306'),
        'database' => env('MYSQL_DB_DATABASE', 'iranad'),
        'username' => env('MYSQL_DB_USERNAME', 'root'),
        'password' => env('MYSQL_DB_PASSWORD', 'mysql'),
        'charset' => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => null,
    ],

    'mongodb' => [
        'driver' => 'mongodb',
        'host' => env('MONGO_DB_HOST', 'localhost'),
        'port' => env('MONGO_DB_PORT', '27017'),
        'database' => env('MONGO_DB_DATABASE'),
        'username' => env('MONGO_DB_USERNAME'),
        'password' => env('MONGO_DB_PASSWORD'),
        'options' => [
            'database' => 'admin'
        ]
    ],

],

然后在.env上定义每个变量名称

#sql 
MYSQL_DB_HOST=...
MYSQL_DB_PORT=...
MYSQL_DB_DATABASE=...
MYSQL_DB_USERNAME=...
MYSQL_DB_PASSWORD=...

# mongo
MONGO_DB_HOST=...
MONGO_DB_PORT=...
MONGO_DB_DATABASE=...
MONGO_DB_USERNAME=...
MONGO_DB_PASSWORD=...
模型上的

定义了受保护的连接属性:这应该是您在database.php上定义的连接名称之一

  protected $connection = 'mongodb';

这里唯一的问题是实现数据库之间的关系,这是不可能的,你需要为此编写自己的查询。

仅供参考:在修补程序中测试您的连接:

DB::connection('mongodb')->collection('migrations')->get();

注意这里的mongodb是database.php文件中的连接名称,而migrations是集合名称。