Подтвердить что ты не робот

Laravel 4 - Подключение к другой базе данных

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Сначала. Добавьте второе соединение в 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'    => '',
        ),
    ),
);

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

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

Там больше документации по этому вопросу - см. Доступ к соединениям.

Красноречивый ORM Вы можете определить переменную для "соединения" в классе eloquent, чтобы установить, какое соединение используется. Это отмечено в разделе Основное использование.

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

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

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

Ответ 2

Помните, что 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();

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

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

Ответ 3

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

В таком сценарии в 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');

Включение конструктора запросов, которое вы можете выполнить

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

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

Надеюсь, это поможет разработчикам найти возможное решение для этого вопроса

Ответ 4

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

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

}

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

Теперь я не полностью использую Eloquent ORM все время, поэтому этот "взломать" может не работать с методами Many to Many или One to Many Eloquent.

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

SELECT * from db2.mytable where id = 1;

Ответ 5

Чтобы использовать файл конфигурации в другом месте, скажем 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");

Ответ 6

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

Добавьте свою машину в $env,

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