Php 如何使用动态数据库登录?

Php 如何使用动态数据库登录?,php,laravel-5,eloquent,Php,Laravel 5,Eloquent,我正在制作关于laravel 5.7的项目。在这里,我必须使用动态数据库管理登录。其中一个主数据库和另一个是子数据库。 因此,当用户提供登录详细信息时,如果在主数据库上找不到登录名,则首先检查主数据库,然后在App\u clients表上查看master\u db上的电子邮件,并找到该电子邮件id的数据库名称并检查登录名。如果登录成功,则移动到仪表板。每次登录子数据库(客户端2)之前,数据库都将激活 这个概念的主要目标是有两种不同的登录方式。 1) 仅限软件所有者登录主数据库。 2) 另一个登录

我正在制作关于laravel 5.7的项目。在这里,我必须使用动态数据库管理登录。其中一个主数据库和另一个是子数据库。 因此,当用户提供登录详细信息时,如果在主数据库上找不到登录名,则首先检查主数据库,然后在App\u clients表上查看master\u db上的电子邮件,并找到该电子邮件id的数据库名称并检查登录名。如果登录成功,则移动到仪表板。每次登录子数据库(客户端2)之前,数据库都将激活

这个概念的主要目标是有两种不同的登录方式。

1) 仅限软件所有者登录主数据库。 2) 另一个登录是针对正在使用此软件的客户端的

因此,当客户端登录时,他们的数据库名称将使用他们的电子邮件从App\u client表中显示出来。因此Laravel数据库配置将更改并设置新数据库供其使用,并且数据库将处于活动状态,直到客户端登录,否则默认数据库将处于活动状态

比如说

数据库::
主数据库、客户端数据库、客户端数据库等。
电邮:abc@ex.com密码:1234存储在Client_2_db中

首先,它将检查Master_db。它将失败。然后它的电子邮件将在Master\u db.App\u客户端上查看,并将获得存储在Master\u db.App\u客户端上的数据库名称。 因此,在这之后,将尝试从客户端登录

为此,我在myLoginController上使用了这段代码

   if( $request->client == '1111111'  )
    {
        Config::set('database.default', 'mysql');
        DB::reconnect('mysql');
        $loginCheck=  Auth::attempt( ["email" =>$request->username , "password" => $request->password ] );
        if( $loginCheck  )
        {
            // Store Collage ID on session variable.
            $client = SettingClient::where('client_CODE',$request->client_code)->first();
            $request->session()->put('client', $client->ID );
            $request->session()->put('cclient_code', $client->client_CODE );
            $request->session()->put('client_name', $client->client_NAME );
            $request->session()->put('database_name', 'col_master' );
            return redirect('dashboard');
        }
        goto InvalidLoginFound;

    }
    elseif (  $request-> client_code != '1111111'  )
    {
           $clientCheck =  AppClient::where("client_code" , $request->client_code )->orderBy('id','desc')->first();
        if( !$clientCheck   )
        {
            goto clientCodeNotFound ;
        }
        DB::purge('mysql');
        Config::set("database.connections.mysql", [
            "driver" => "mysql",
            "host" => env('DB_HOST'),
            "database" => $clientCheck->database_name,
            "username" => env('DB_USERNAME'),
            "password" => env('DB_PASSWORD'),
            "engine"=>"InnoDB",
        ]);
        Config::set('database.default', 'mysql');
        DB::reconnect('mysql');

        $loginCheck=  Auth::attempt( ["email" =>$request->username , "password" => $request->password ] );
        if( $loginCheck  )
        {
            // Store client ID on session variable.
            $client = SettingClient::where('client_CODE',$request->client_code)->first();
            if( !$client )
            {
                goto clientCodeNotFound;
            }
            $request->session()->put('client', $client->ID );
            $request->session()->put('login_id', $request->username  );
            $request->session()->put('password',  $request->password  );
            $request->session()->put('client_code', $client->client_CODE );
            $request->session()->put('client_name', $client->client_NAME );
            $request->session()->put('database_name', $clientCheck->database_name );
            return redirect('dashboard');
        }

        $request->session()->flush();
        Auth::logout();
        goto InvalidLoginFound;

    }
还为此创建了一个中间件,用于根据每个请求管理数据库

 class DynamicDatabaseMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if( session()->get('login_id')  )
        {
            DB::purge('mysql');
            Config::set("database.connections.mysql", [
                "driver" => "mysql",
                "host" => '127.0.0.1',
                "database" => session()->get('database_name')?session()->get('database_name'):'',
                "username" => 'root',
                "password" => '',
                "engine"=>"InnoDB",
            ]);
           // Config::set('database.default', 'mysql');
            DB::reconnect('mysql');


        }
        return $next($request);
    }
}
关于Karnel.php

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        // \Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
        \App\Http\Middleware\SessionDataMiddleware::class,
        \App\Http\Middleware\StoreExceptionMiddleware::class,


        \App\Http\Middleware\DynamicDatabaseMiddleware::class, 
    ],
在这之后,这是可行的,但问题是当我尝试在Auth::user()中检查登录时,我总是从Master\u db(col\u Master)表单中从客户端\u db获取登录详细信息。
为什么?我不知道。请更正此代码。

您的路径正确。只是还没到

您需要在中间件中添加整个登录请求,并且对于要检查的每个数据库连接,都要设置一个开关或try/catch(使用->continue)或者使用if/elseif语句转到您拥有的evry数据库连接,如果在其中一个数据库连接中找到该用户,则它将连接该用户并转到下一个请求。如果没有,则它将显示错误。请注意,在语句(数据库连接开关)中,您需要清除连接并再次连接到新的数据库用户名/密码。你可以用(

)


祝你好运

我搜索了很多,尝试了很多解决方案,但在我的时代没有任何解决方案。 现在我回答了我的问题

我只是做了一个函数,在.ENV文件中搜索DB_名称,然后替换它。 当我的客户机登录数据库找到后,它将旧的数据库名称替换为新的on.ENV。 再次登录后,在注销时替换默认数据库名称

   protected function updateEnv($key, $newValue, $separator='')
    {

        $path = base_path('.env');
        // get old value from current env
        $oldValue = env($key);

        // was there any change?
        if ($oldValue === $newValue) {
            return;
        }

        // rewrite file content with changed data
        if (file_exists($path)) {
            // replace current value with new value
            return  file_put_contents(
                $path, str_replace(
                    $key.'='.$separator.$oldValue.$separator,
                    $key.'='.$separator.$newValue.$separator,
                     file_get_contents($path)
                )
            );
        }
    }
//用于登录

  $this->updateEnv('DB_DATABASE',$appClient->db_name,'');
但仍然是个问题。它第一次返回null,然后再次刷新,工作正常。。为什么?我不知道


此解决方案不适用于多个来自不同位置的登录

使用此方法连接多个db的Gaurav ji,因为您不了解我的要求。请阅读我的问题…我的子数据库的数据库名称来自主数据库,当客户端想要登录时,每次记录都会来自App_客户端表…我已经更新了我的问题。所以请检查并回复。你能和我分享一下你的电子邮件号码吗pankajwork017@gmail.com. 我将与你分享真实的代码。请帮帮我,我没有时间,gupta ji如果你能加入我的anydex,那么我可以演示我的问题..先生,现在我面临Auth::user()的问题。当我尝试在另一个api上使用Auth::user()时,它就不起作用了。。并从Master_DB users表中给出记录。假设客户端数据库是client_2,那么在登录Auth::user()之后应该从客户端数据库返回结果,但从主数据库返回数据。当不同的api调用时,它会从主数据库->用户表中获取数据。然后,您需要检查模型中的连接,并使其也是动态的,以便根据登录名随数据库的更改而更改。使数据库crud操作的模型。假设你有4个数据库,1个主数据库和3个从数据库,或者backeup之类的。但所有4个表位都相同,但数据却不同。您需要在模型中添加连接名称,这样就可以开始了。受保护的$connection='mysql';protected$table='模型正在使用的选项卡名称ex:users';我可以这样做吗?$connection=Session->get('connection')如果您使用的是api登录,那么这是不好的。如果您同时有两个或多个登录,那么您的应用程序将崩溃,因为您正在为用户更改相同的连接。
  $this->updateEnv('DB_DATABASE',$appClient->db_name,'');