[php] 라 라벨에서 여러 데이터베이스를 사용하는 방법

시스템에 여러 데이터베이스를 결합하고 싶습니다. 대부분의 경우 데이터베이스는 MySQL입니다. 그러나 관리자는 이기종 데이터베이스 시스템의 소스를 사용 하는 보고서를 생성 할 수 있습니다 .

그래서 제 질문은 Laravel 이 그러한 상황을 처리하기 위해 Facade제공 합니까? 또는 다른 프레임 워크가 문제에 더 적합한 기능을 가지고 있습니까?



답변

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

참고 : 에서 mysql2DB_username 및 DB_password가 동일한 경우, 당신은 사용할 수 있습니다 env('DB_USERNAME')에 metioned되는 .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();

유용한 링크

  1. Laravel 5 다중 데이터베이스 연결 FROM laracasts.com
  2. laravel FROM에서 여러 데이터베이스 연결 tutsnare.com
  3. Laravel FROM의 다중 DB 연결 fideloper.com

답변

Laravel 5.1에서 연결을 지정합니다 :

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

기본적으로 Laravel은 기본 연결을 사용합니다. 간단하지 않습니까?

자세한 내용은 여기를 참조하십시오 : http://laravel.com/docs/5.1/database#accessing-connections


답변

DB::connection('name')->select(..)‘name’은 큰 따옴표로 묶어야하기 때문에 실제로 는 작동하지 않습니다. “name”

여전히 선택 쿼리는 기본 연결에서 실행됩니다. 여전히 알아 내려고 노력하면서 Laravel이 의도 한 방식으로 작동하도록 설득하는 방법 : 연결 변경.

편집 : 알아 냈습니다. Laravels DatabaseManager를 디버깅 한 후 내 database.php (config 파일) ($ this-> app 내부)가 잘못되었습니다. “connections”섹션에서 나는 “database”와 같은 것을 가지고 그것을 복사 한 것의 값을 가졌다. 명확한 용어 대신

env('DB_DATABASE', 'name')

나는 같은 것을 배치해야했다.

'myNewName'

모든 연결이 데이터베이스, 사용자 이름, 비밀번호 등에 대해 동일한 값으로 나열되었으므로 적어도 다른 데이터베이스 이름에 액세스하려는 경우에는 의미가 없습니다.

따라서 다른 데이터베이스에서 무언가를 선택하려고 할 때마다 항상 기본 데이터베이스가되었습니다.


답변

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';

이러한 모델을 확장하여 각 DB에서 테이블에 대한 더 많은 모델을 만들 수 있습니다.


답변