Laravel 4 - Подключение к другой базе данных
Я хочу иногда подключаться к другой базе данных.
Я создал файл config.php с данными подключения к базе данных.
Но как я могу сказать laravel, чтобы подключиться к этой базе данных, используя config/database.php?
Например, при использовании класса Schema
.
Поскольку никто, кажется, не понимает, чего я хочу.
Я НЕ хочу использовать config/database.php, я хочу использовать другой файл конфигурации в другом месте.
Ответы
Ответ 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
с новыми параметрами конфигурации.