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


224

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

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

답변:


469

사용 .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

1
당신은 사용할 수 있습니다 class SomeModel extends Model { 또한 당신이 같은 ENV 파일에서 제거 GET 값이 있는지 확인 env('DB_DATABASE', 'name')@sba 언급 한대로 database.php 파일에 새로운 DB 구성 배열을 만들 때
Sadee

1
안녕하세요, Lumen을 사용하고 있으며 데이터베이스 구성 부분에는 ".env"파일 만 있습니다. database.php가 아닙니다. 어떻게이 문제를 해결할 수 있습니까?
Chanaka De Silva 2016

1
@ChanakaDeSilva 루멘을위한 설정 폴더와 database.php 파일을 만들면됩니다. 분명히 루멘은 해당 파일이 존재하는지 지속적으로 확인하고 있으면 파일을 사용합니다.
Ecksters

1
고마워 친구 내가이 일을 지금 생각; p
binar

1
@AbdullaNilam some1은 multidb 앱을 처음으로 생각하게 해주었습니다. 이제 가능한지 모르겠습니다.
가능한지 모르겠습니다

12

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

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

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

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


Laravel 5.1에서 Eloquent는 어떻습니까?
simo

1
@simo, Abdulla의 답변을 참조하십시오.
schellingerht

<a href=" stackcoder.in/posts/… 7.x에서 여러 데이터베이스 연결, 마이그레이션, 관계 및 쿼리</a> 에서 확인할 수있는 sam에 대한 전체 기사를 작성했습니다.
Channaveer Hakari

6

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

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

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

env('DB_DATABASE', 'name')

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

'myNewName'

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

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


1
감사합니다! 당신은 내 정신을 구했습니다. 모든 쿼리가 기본 데이터베이스를 참조한 이유를 알아 내려고 노력했습니다. 그런 다음 게시물을 읽고 env가 항상 .env 값을 반환했으며 두 번째 매개 변수는 Laravel이 사용하지 않은 폴백이라는 것을 깨달았습니다.
Moha

주제 외 : 관리자가 내 게시물을 조작하지 않으면 좋을 것입니다. 또는 적어도 왜 그리고 왜 그들이 바꾸고 싶은지 개인 메시지를 작성하십시오. 개인 메시지를 보내는 방법을 찾지 못했습니다.
SBA

비슷한 문제가 있었지만 값은 변경했지만 키는 변경하지 않았습니다. 'database'=> env ( 'DB_NEW_DATABASE', 'myNewDatabase')와 같이 작동했습니다. 잘 주목했다!
Fellipe Sanches

0

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에서 테이블에 대한 더 많은 모델을 만들 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.