2013-07-01 3 views
26

Я хочу иногда подключаться к другой базе данных.Laravel 4 - Подключение к другой базе данных

Я создал config.php с данными подключения к базе данных.

Но как я могу рассказать laravel, чтобы подключиться к этой базе данных с помощью config/database.php?

Например, при использовании класса Schema.

Поскольку никто, кажется, не понимает, чего я хочу.

Я НЕ хочу использовать config/database.php, я хочу использовать другой файл конфигурации в другом месте.

+0

Поскольку вы не давая какой-либо конкретный код «порт», посмотри [здесь] (http://forums.laravel.io /viewtopic.php?pid=6387), если он отвечает на ваш вопрос. –

+0

Какой код? Как я уже сказал, я хочу создать дополнительный config.php с настройками базы данных и подключиться к этому. Вопрос в том, как я могу сказать laravel, чтобы использовать эту конфигурацию config/database.php. – Michael

+0

На связанной странице показано, как добавить несколько конфигураций базы данных в файл database.php и как выбрать, какой из них использовать для подключения к/query. –

ответ

55

Похоже, вы поняли это. Вот как я мог бы это сделать в любом случае для других людей, приезжающих, или в случае, если что-то полезное здесь для вас.

Первый, Добавить второе соединение в app/config/database.php. Примечание. Этот путь к файлу может меняться в зависимости от вашей среды.

<?php 
return array(
    'connections' => array(
     'mysql' => array(
      'driver' => 'mysql', 
      'host'  => 'localhost', 
      'database' => 'database1', 
      'username' => 'user1', 
      'password' => 'pass1' 
      'charset' => 'utf8', 
      'collation' => 'utf8_unicode_ci', 
      'prefix' => '', 
     ), 

     'mysql2' => array(
      'driver' => 'mysql', 
      'host'  => 'localhost', 
      'database' => 'database2', 
      'username' => 'user2', 
      'password' => 'pass2' 
      'charset' => 'utf8', 
      'collation' => 'utf8_unicode_ci', 
      'prefix' => '', 
     ), 
    ), 
); 

Второй, в вашем коде, вы можете использовать (как уже упоминалось) 2-й связи, где вы хотели бы:

Schema::connection('mysql2')->create('users', function($table) {})

Там больше документации об этом - см Accessing Connections.

Eloquent ORM Вы можете определить переменную для «связи» в красноречивой классе, чтобы установить, какое соединение используется. Это отмечено в разделе Basic Usage.

См. Эту переменную here on Github и способ, который вы можете установить для динамического подключения here.

Редактировать В ОП четко указано, что они не хотят использовать файл config/database.php для конфигурации.

Однако, не поясняя далее, я не могу комментировать. Я рад помочь - кажется, было бы полезно знать , почему файл config/database.php не может/не должен использоваться, так как это может помочь нам выяснить проблему и создать полезное решение.

+1

Я использую ModulSystem. Это причина;) – Michael

+0

Как насчет валидации? Например, правило «существует». Как вы говорите, чтобы использовать другое соединение/базу данных? – cen

+0

Вы можете переопределить, какое соединение установлено в [Поставщик услуг проверки] (https://github.com/laravel/framework/blob/4.1/src/Illuminate/Validation/ValidationServiceProvider.php#L30). Я не знаю, нужно ли переключаться между подключениями к базе данных. Вам придется копаться в коде и делать некоторые растягивающиеся/переходящие. – fideloper

11

Помните, что Laravel 4 на самом деле представляет собой набор компонентов, и вы можете использовать эти компоненты соло.

https://github.com/illuminate/database

Существует пример здесь показывает, как взаимодействовать с классом Capsule работает:

use Illuminate\Database\Capsule\Manager as Capsule; 

$capsule = new Capsule; 

$capsule->addConnection([ 
    'driver' => 'mysql', 
    'host'  => 'localhost', 
    'database' => 'database', 
    'username' => 'root', 
    'password' => 'password', 
    'charset' => 'utf8', 
    'collation' => 'utf8_unicode_ci', 
    'prefix' => '', 
]); 

// Set the event dispatcher used by Eloquent models... (optional) 
use Illuminate\Events\Dispatcher; 
use Illuminate\Container\Container; 
$capsule->setEventDispatcher(new Dispatcher(new Container)); 

// Set the cache manager instance used by connections... (optional) 
$capsule->setCacheManager(...); 

// Make this Capsule instance available globally via static methods... (optional) 
$capsule->setAsGlobal(); 

// Setup the Eloquent ORM... (optional; unless you've used setEventDispatcher()) 
$capsule->bootEloquent(); 

Это связка самозагрузкой, что вам нужно запустить, так уложить ее прочь где-то в функции или методе.

Но, это абсолютно возможно.

5

Существует более простое решение. Если вы используете Larave 4, есть опция, которая сработала для меня. Недавно они добавили переменную $ table, которую вы можете указать в своей модели. См. this link.

class User extends Eloquent { 

    protected $table = 'my_users'; 

} 

Если вы используете MySQL, вы можете сделать следующее:

class User extends Eloquent { 

    protected $table = 'mydbname.my_users'; 

} 

Если вы используете SQL Server, вы можете сделать это:

class User extends Eloquent { 

    protected $table = 'mydatabase..my_users'; 

} 

Мой конфигурационный файл имел DB1 но я создал модель, которая хочет получить доступ к DB2 на том же хосте MySQL. Так что это был быстрый и грязный способ сделать это.

Теперь я не полностью использую Eloquent ORM все время, поэтому этот «взломать» может не работать со многими для многих или от одного до многих ядовитых методов.

Одна другая идея, которую я имел, но я на самом деле не попробовать было создание хранимой процедуры (рутина) в DB1 и внутри этой подпрограммы я могу получить доступ к таблицам DB2, запрашивая ссылке это:

SELECT * from db2.mytable where id = 1; 
+0

Если вы довольны тем, что имеете один и тот же доступ к обоим базам данных, это красиво изящное решение. – voidstate

1

bootstrap/start.php Редактировать файл и добавьте имя вашей машины (открытый терминал: hostname).

Добавьте вашу машину в $ ENV,

$env = $app->detectEnvironment(array(
    'mymachine' => array('mymachine.local'), 
)); 
  1. Создать новый путь в 'app/config/mymachine'
  2. Добавить копию database.php с новыми конфигурационными Params.
3

Чтобы использовать конфигурационный файл в другом месте, скажем src/config:

use Config; 


$this->dbConfig = Config::get('appname::dbInfo.connections.test'); 
$this->database = $this->dbConfig['database']; 
$this->username= $this->dbConfig['username']; 
$this->password= $this->dbConfig['password']; 

Где dbInfo является простой PHP файл в src/config каталог приложения возвращая массив, содержащий элемент connections, который представляет собой массив из базы данных свойства.

Вы можете сказать Laravel использовать внешний конфигурационный файл с помощью:

Config::set("database.connections.test", $this->dbConfig); 
DB::connection("test"); 
10

Я считаю, что вы хотите реализовать какое-то логическое сегментирование, где базы данных будет динамически создаются.

В таком случае в Laravel вы можете динамически добавлять конфигурации базы данных, как показано ниже

$conn = array(
    'driver' => 'mysql', 
    'host'  => 'localhost', 
    'database' => 'DATABASE', 
    'username' => 'USERNAME', 
    'password' => 'SOME_PASSWORD', 
    'charset' => 'utf8', 
    'collation' => 'utf8_unicode_ci', 
    'prefix' => '', 
); 

Config::set('database.connections.DB_CONFIG_NAME', $conn); 

Теперь подключиться через красноречивый

MODEL::on('DB_CONFIG_NAME')->WHAT_EVER('1'); 

Упакуйте Query Builder можно сделать

$DB = DB::connection('DB_CONFIG_NAME'); 

использование $DB->select() для запроса сейчас.

Надеется, что это поможет УБСУ ищет возможное решение для этого вопроса

+0

Это не работает с Laravel 5.2, DatabaseManager.php: исключение 239 throws 'Database [database.connections.DB_CONFIG_NAME] не настроено.' Я также попробовал 'App :: make ('config') -> set ('database.connections.DB_CONFIG_NAME', $ conn)', с тем же результатом. Есть идеи? –

+0

Извините, моя ошибка. Я пропустил тот простой факт, что вам не нужен префикс «database.connections.» при обращении к настроенному соединению позже. По какой-то причине сообщение об ошибке полностью отбросило меня. –