Я создаю проект laravel, для которого мне нужна одна установка laravel, и используйте его экземпляр в поддомене с отдельной базой данных . И эти данные отдельной базы данных не будут в config / database.php. Он будет получать из основной базы данных, а затем снова подключиться к другой базе данных.
Я не нашел подходящего способа сделать это.
У вас есть идеи по этому поводу?
Спасибо за ваше время.
Laravel поддерживает несколько соединений с базой данных. Во-первых, определите соединения в config/database.php
:
<?php return array( 'default' => 'default_connection', 'connections' => array( // domain.com 'default_connection' => array( 'driver' => 'mysql', 'host' => 'localhost', 'database' => 'primary_database', 'username' => 'username', 'password' => 'password' 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', ), // sub.domain.com 'subdomain_connection' => array( 'driver' => 'mysql', 'host' => 'localhost', 'database' => 'secondary_database', 'username' => 'username', 'password' => 'password' 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', ), ), );
Теперь, чтобы указать, какое соединение должны использовать ваши модели, вы можете установить свойство $connection
в своих моделях:
<?php class YourModel extends Eloquent { protected $connection = 'subdomain_connection'; }
Вы можете установить значение $connection
программно.
Если вы хотите обработать это из базы данных, тогда проверьте имя хоста с http-url и вызовите соединение с базой данных в соответствии с именем хоста. например ( http://abc.maindomain.com , получить abc из URL-адреса)
Я бы сделал так:
Создание одной базы данных на домен
Настройте доступные соединения DB в файле laravel config/database.php
:
'connections' => [ 'mysql_domain_1' => [ 'driver' => 'mysql', /* other config values... */ ], 'mysql_domain_2' => [ 'driver' => 'mysql', /* other config values... */ ] ];
В ранней фазе цикла запроса (например, в промежуточном программном обеспечении), получить поддомен от запроса и установить текущее соединение с БД соответственно
Например, создайте промежуточное программное обеспечение и в методе handle
:
public function handle($request, Closure $next) { //check the request URL and get subdomain //get the db connection associated to the subdomain //set the connection for this request Config::set('database.default', $dbConnection); }
Config::set('database.default', $dbConnection );
будет установлено соединение db, используемое всем приложением для текущего цикла запроса
Multi-tenancy – сложная архитектура, которая нуждается в моделировании. Существует несколько способов достижения этой архитектуры. Некоторые решают использовать одну базу данных, другие предпочитают использовать несколько баз данных (что в вашем случае).
У них обоих есть свои плюсы и минусы, которые вам нужно учитывать. Есть много факторов, которые необходимо учитывать, прежде чем вы начнете моделировать свое приложение. например, конфигурация виртуального хоста для поддоменов, миграция базы данных (откат всех баз данных при необходимости и т. д.). Я предлагаю эти два пакета, которые могут помочь вам, и дать вам больше информации о том, как смоделировать приложение в наборе, что вы хотите.
Вы можете установить конфигурацию БД, выполнив следующие действия:
$tenant = Tenant::whereSubDomain($subdomain)->first(); Config::set('database.connections.mysql.database', $tenant->db_name); Config::set('database.connections.mysql.username',$tenant->db_username); Config::set('database.connections.mysql.password',$tenant->db_password); dd(\DB::connection('mysql'));
См. Эту ссылку. Настройте динамическое подключение к базе данных в приложении Multi tenant для справки.
Вот как я подхожу к этому:
В вашем config / database.php :
<?php function getDatabaseConnectionParameters() { $connectionParams = array(); // add the default connection // this is your master database $connParams = array( 'driver' => 'mysql', 'host' => 'localhost', 'database' => 'master', 'username' => 'master_user', 'password' => 'master_password', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', 'strict' => false, ); array_push($connectionParams, array('mysql' => $connParams); // TODO: connect to your master database using PDO/mysqli or anything else you know. // The point is: you can't use Laravel ORM just yet because you are currently setting up its configuration! // Get the list of subdomain connection parameters and array_push it to $connectionParams just like above. // Example: // array_push($connectionParams, array('subdomain' => $subdomainConnParams) return $connectionParams; } return array ( 'default' => 'mysql' ,'connections' => getDatabaseConnectionParameters() ) ?>
При этом конкретным моделям поддоменов необходимо только правильно указать $ connection. Пример:
<?php class YourModel extends Eloquent { protected $connection = 'subdomain'; } ?>
Таким образом, конфигурации базы данных субдоменов могут быть сохранены в вашей основной базе данных, делая ваши модели простыми и все же Laravel-ful. Кроме того, нет никаких неприятных хаков, которые могли бы улучшить версию Laravel.