无法在Laravel中通过手动设置连接数据库

时间:2018-11-30 15:11:54

标签: database laravel laravel-5 database-connection mariadb

我正在工作的项目需要在运行时与此连接多个数据库,我正在动态设置连接属性,我这样做如下:

我创建了一个助手

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表中,我的字段具有正确的信息,但是在更改数据库时,系统会告诉我这一点,而且我不明白为什么我没有本地用户和数据库有密码

有人知道我的代码丢失了,或者我做错了使多租户系统正常工作?

2 个答案:

答案 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上的所有连接:(