2015-05-23 3 views
1

Я использую Slim Framework с Eloquent 4.1.x в качестве ORM для проекта и нуждаюсь в подключении к нескольким базам данных.Slim Framework с ORM (Eloquent) connect multiple db

Я следовал за этим link, чтобы установить ORM. Но как я могу подключиться к нескольким базам данных, следуя данному учебнику?

В моих моделях у меня есть разные файлы, которые используются для разных таблиц в разных базах данных.

Как файл User.php имеет следующее,

<?php 
namespace Service\Framework\Model; 

use Illuminate\Database\Eloquent\Model; 

class Users extends Model { 
    protected $table = 'users'; 
} 

Этот класс использует таблицу пользователей в базе данных db_2. Я хочу переключиться с базы данных db_1 по умолчанию в методе этого класса. Например,

<?php 

namespace Service\Framework\Model; 

use Illuminate\Database\Eloquent\Model; 

class Users extends Model { 
    protected $table = 'users'; 

    public function getUsers() { 
    // Switch the database to db_2 
    $users = self::all(); 
    // Again switch back to default database db_1 
    return $users; 
    } 
} 

Как это сделать? Пожалуйста, помогите мне с некоторыми предложениями.

P.S: Я не использую капсулу здесь.

EDIT # 1 Поэтому код, я использую для установки одного соединения заключается в следующем,

$settings = array(
     'driver' => 'mysql', 
     'host' => 'localhost', 
     'database' => 'db_1', 
     'username' => 'dbuser', 
     'password' => 'password', 
     'charset' => 'utf8', 
     'collation' => 'utf8_general_ci', 
     'prefix' => '' 
    ); 

    // Bootstrap Eloquent ORM 
    $container = new Container(); 
    $connFactory = new ConnectionFactory($container); 
    $conn = $connFactory->make($settings); 
    $resolver = new ConnectionResolver(); 
    $resolver->addConnection('default', $conn); 
    $resolver->setDefaultConnection('default'); 
    Model::setConnectionResolver($resolver); 

ответ

2

Сначала вы должны установить несколько соединений. После установки соединений вы можете указать модели использовать конкретное соединение с $connection.

namespace Service\Framework\Model; 

use Illuminate\Database\Eloquent\Model; 

class Users extends Model { 
    protected $connection = 'mysql2'; 
    protected $table = 'users'; 
} 

В маршрутах или контроллерах вы можете использовать метод setConnection().

$user = new User; 
$user->setConnection('mysql2'); 
print_r($user->find(1)); 
+0

Спасибо Майк, один запрос хотя. Как настроить несколько соединений с кодом, который я использую? Любая догадка? Я обновил свой вопрос с помощью фрагмента кода. Пожалуйста, предложите. –

+0

Я действительно не использую Eloquent, но смотрю на код, скорее всего, создавая еще один объект $ conn, например $ conn2 с разными $ настройками. Затем вызовите что-то вроде $ resolver-> addConnection ('mysql2', $ conn2); –

+0

Майк, да, это решило мою проблему. Хотя мне пришлось использовать Capsule позже, но основная идея была такой же. –

1

Вы можете подключиться к нескольким базам данных с этим упрощенным кодом:

$app = new \Slim\App([ 
    'db' => [ 
     'driver' => 'mysql', 
     'host'  => 'localhost', 
     'database' => 'products', 
     'username' => 'user', 
     'password' => 'pass', 
     'charset' => 'utf8', 
     'collation' => 'utf8_unicode_ci', 
     'prefix' => '', 
    ], 
    'db_second' => [ 
     'driver' => 'mysql', 
     'host'  => 'localhost', 
     'database' => 'second', 
     'username' => 'user', 
     'password' => 'pass', 
     'charset' => 'utf8', 
     'collation' => 'utf8_unicode_ci', 
     'prefix' => '', 
    ], 
]); 

$container = $app->getContainer(); 

// connect to db with Illuminate larvel 
$capsule = new \Illuminate\Database\Capsule\Manager; 
$capsule->addConnection($container['settings']['db']); 
$capsule->addConnection($container['settings']['db_second'], 'db_second'); 
$capsule->setAsGlobal(); 
$capsule->bootEloquent(); 
/// END connect to db 

// to accsess the $capsule with our container from our controllers 
$container['db'] = function($container) use ($capsule){ 
    return $capsule; 
}; 

и в модели файла положить:

protected $connection = 'db_second';