如何在laravel中使用多个数据库

btqmn9zl  于 2021-06-20  发布在  Mysql
关注(0)|答案(5)|浏览(346)

我想在我的系统中合并多个数据库。大多数时候数据库是mysql;但将来可能会有所不同,管理员可以生成这样的报表,这是异构数据库系统的使用来源。
所以我的问题是,拉威尔是否提供了任何门面来处理这种情况?或者其他任何一个框架都有更适合问题的功能是什么?

2jcobegt

2jcobegt1#

laravel内置了对多个数据库系统的支持,您需要在config/database.php文件中提供连接细节

return [
    'default' => env('DB_CONNECTION', 'mysql'),

    'connections' => [
        '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', ''),
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'strict' => false,
            'engine' => null,
        ],
'mysqlOne' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST_ONE', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE_ONE', 'forge'),
            'username' => env('DB_USERNAME_ONE', 'forge'),
            'password' => env('DB_PASSWORD_ONE', ''),
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'strict' => false,
            'engine' => null,
        ],
];

一旦您有了这个,您就可以为每个连接创建两个基本模型类,并在这些模型中定义连接名称

//BaseModel.php
protected $connection = 'mysql';

//BaseModelOne.php
protected $connection = 'mysqlOne';

您可以扩展这些模型,为每个数据库中的表创建更多的模型。

gk7wooem

gk7wooem2#

您也可以使用postgres fdw系统
https://www.postgresql.org/docs/9.5/postgres-fdw.html
你可以在postgres中连接不同的数据库。之后,在一个查询中,可以访问不同数据库中的表。

vq8itlhq

vq8itlhq3#

使用.env>=5.0(在5.5上测试)

.env ```
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database1
DB_USERNAME=root
DB_PASSWORD=secret

DB_CONNECTION_SECOND=mysql
DB_HOST_SECOND=127.0.0.1
DB_PORT_SECOND=3306
DB_DATABASE_SECOND=database2
DB_USERNAME_SECOND=root
DB_PASSWORD_SECOND=secret

在 `config/database.php` ```
'mysql' => [
    'driver'    => env('DB_CONNECTION'),
    'host'      => env('DB_HOST'),
    'port'      => env('DB_PORT'),
    'database'  => env('DB_DATABASE'),
    'username'  => env('DB_USERNAME'),
    'password'  => env('DB_PASSWORD'),
],

'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'),
],

注:在 mysql2 如果db\u用户名和db\u密码相同,则可以使用 env('DB_USERNAME') 这是在 .env 前几行。

无.env<5.0

定义连接 app/config/database.php ```
return array(

'default' => 'mysql',

'connections' => array(

    # Primary/Default database connection
    'mysql' => array(
        'driver'    => 'mysql',
        'host'      => '127.0.0.1',
        'database'  => 'database1',
        'username'  => 'root',
        'password'  => 'secret'
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
    ),

    # Secondary database connection
    'mysql2' => array(
        'driver'    => 'mysql',
        'host'      => '127.0.0.1',
        'database'  => 'database2',
        'username'  => 'root',
        'password'  => 'secret'
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
    ),
),

);

架构
要指定要使用的连接,只需运行 `connection()` 方法

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

查询生成器

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

雄辩的
设置 `$connection` 模型中的变量

class SomeModel extends Eloquent {

protected $connection = 'mysql2';

}

您还可以在运行时通过 `setConnection` 方法或 `on` 静态方法:

class SomeController extends BaseController {

public function someMethod()
{
    $someModel = new SomeModel;

    $someModel->setConnection('mysql2'); // non-static method

    $something = $someModel->find(1);

    $something = SomeModel::on('mysql2')->find(1); // static method

    return $something;
}

}

注意:在尝试跨数据库与表建立关系时要小心!这是可以做到的,但它可能会附带一些警告,并取决于您的数据库和/或数据库设置。

## 来自laravel docs

使用多个数据库连接
使用多个连接时,可以访问每个连接 `connection` 通过上的连接方法 `DB` 外观。这个 `name` 传递给 `connection` 方法应该对应于 `config/database.php` 配置文件:

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

您还可以在连接示例上使用getpdo方法访问原始的基础pdo示例:

$pdo = DB::connection()->getPdo();

有用的链接
来自的laravel 5多个数据库连接 `laracasts.com` 从连接laravel中的多个数据库 `tutsnare.com` 来自的laravel中的多个db连接 `fideloper.com` 
5cg8jx4n

5cg8jx4n4#

事实上, DB::connection('name')->select(..) 不适用于我,因为“name”必须用双引号引起来:“name”
不过,select查询是在我的默认连接上执行的。仍在试图弄清楚,如何说服拉威尔按预期的方式工作:改变连接。
编辑:我想出来了。在调试laravels databasemanager之后,发现我的database.php(配置文件)(在$this->app中)是错误的。在“连接”一节中,我有“数据库”之类的东西,它们的值是我从中复制的。明确地说,而不是

env('DB_DATABASE', 'name')

我需要放置一些

'myNewName'

因为列出的所有连接都具有相同的数据库值、用户名、密码等。如果我想至少访问另一个数据库名称,这当然没有什么意义
因此,每次我想从另一个数据库中选择一些东西时,我总是以默认数据库结束

cnwbcb6i

cnwbcb6i5#

在laravel 5.1中,指定连接:

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

默认情况下,laravel使用默认连接。很简单,不是吗?
阅读更多信息:http://laravel.com/docs/5.1/database#accessing-连接

相关问题