我正在工作的项目需要在运行时与此连接多个数据库,我正在动态设置连接属性,我这样做如下:
我创建了一个助手
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
if(! function_exists('conexionBD')){
/**
* Establish a tenant database connection.
*
* @param $hostname
* @param $username
* @param $password
* @param $database
*/
function conexionBD($hostname, $username, $password, $database){
DB::purge('empresa');
Config::set('database.connections.empresa.host', $hostname);
Config::set('database.connections.empresa.database', $database);
Config::set('database.connections.empresa.username', $username);
Config::set('database.connections.empresa.password', $password);
DB::reconnect('empresa');
Schema::connection('empresa')->getConnection()->reconnect();
}
}
我创建了一个名为Tenant的中间件
public function handle($request, Closure $next) {
if (($request->session()->get('empresaId')) === null)
return redirect()->route('inicio')->withErrors(['error' => __('Por favor inicie sesión en alguna empresa antes de intentar esta acción')]);
$empresa = new empresa();
$empresa->connect();
return $next($request);
}
我的Empresa模型就是这样
class empresa extends Model
{
protected $fillable = [
'hostname',
'username',
'password',
'database'
];
public function connect()
{
if (! $this->connected()) {
conexionBD(
$this->hostname,
$this->username,
$this->password,
$this->database
);
}
}
private function connected()
{
$connection = Config::get('database.connections.empresa');
return $connection['username'] == $this->username &&
$connection['password'] == $this->password &&
$connection['database'] == $this->database;
}
}
现在,当我运行此代码时,出现“ SQLSTATE [HY000] [1045]用户'@'localhost'(使用密码:否)的访问被拒绝”错误,在我的数据库配置中,我有数据库,用户名,密码和主机为空。在我的数据库中,在empresas表中,我的字段具有正确的信息,但是在更改数据库时,系统会告诉我这一点,而且我不明白为什么我没有本地用户和数据库有密码
有人知道我的代码丢失了,或者我做错了使多租户系统正常工作?
答案 0 :(得分:0)
检查根目录中的.env文件,并按示例所示设置数据库值
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=database_name
DB_USERNAME=root
DB_PASSWORD=
答案 1 :(得分:0)
您可以在模型级别更改连接。 希望对您有所帮助。
class ModelOnOtherDB extends Model
{
public function __construct()
{
$this->connection = "other_db";
parent::__construct();
}
}
连接“ other_db”应在config / database.php上配置
其他解决方案
更改连接的可能解决方案
public static function table($table, $bd) {
return DB::table($table)->connection($db);
}
但是您需要condig / database.php上的所有连接:(