Php Laravel模型在多租户应用程序中未使用分配的连接(第二个连接)

Php Laravel模型在多租户应用程序中未使用分配的连接(第二个连接),php,mysql,database,laravel,laravel-5,Php,Mysql,Database,Laravel,Laravel 5,我正在尝试在laravel上构建一个多租户应用程序。 它是从url获取子域,从子域获取租户id,获取租户数据库的凭据,并使用另一个connect连接到该数据库 下面是我在database.php in config文件夹中的数据库配置 'default' => env('DB_CONNECTION', 'mysql'), 'connections' => [ 'mysql' => [ 'driver' => 'mysql'

我正在尝试在laravel上构建一个多租户应用程序。 它是从url获取子域,从子域获取租户id,获取租户数据库的凭据,并使用另一个connect连接到该数据库

下面是我在database.php in config文件夹中的数据库配置

'default' => env('DB_CONNECTION', 'mysql'),

    'connections' => [
        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', 'localhost'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'erptenants'),
            'username' => env('DB_USERNAME', 'root'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'strict' => false,
            'engine' => null,
        ],
        'tenant' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', ''),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', ''),
            'username' => env('DB_USERNAME', ''),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'strict' => false,
            'engine' => null,
        ],
    ],
正如您所看到的,有两个连接。默认值和另一个名为租户。 租户具有通过全局中间件分配的新凭据

名称空间App\Http\Middleware

使用闭包

class TenantIdentification
{    
    public function handle($request, Closure $next)
    {

        $tk = "HYD"; //hardcoded for time being

        $tenant = \App\Models\Tenant::where('tenantKey', $tk)->first();

        \Config::set('database.connections.tenant.host', env('DB_HOST', $tenant ->host));
        \Config::set('database.connections.tenant.username', env('DB_USERNAME', $tenant ->username));
        \Config::set('database.connections.tenant.password', env('DB_PASSWORD', $tenant ->password));
        \Config::set('database.connections.tenant.database', env('DB_DATABASE', $tenant ->database));


        return $next($request);
    }
}
我假设DB凭证的分配是有效的,因为我没有从laravel那里得到任何错误。也许这也是一个坏习惯

现在我有了一个定义了连接的模型

<?php

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    protected $connection = 'tenant';
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];


}

看起来您的配置集语句有错误:

\Config::set('database.connections.tenant.host', env('DB_HOST', $tenant ->host));

这:
env('DB_HOST',$tenant->HOST)
如果在.env中定义,则返回
DB_HOST
,如果在.env中未定义
DB_HOST
DB_USERNAME
等,则只返回
$tenant->HOST
?请发布您的.env文件,看起来它有一些定义。env文件添加到问题正文中,如何解决此问题?删除env thingi并使用\Config::set('database.connections.tenant.host',$tenant->host)???是的,这是实现目标的方法。那么最好也从config/database.php文件中删除“DB_HOST”部分吗?因此环境文件不会被引用。
APP_ENV=local
APP_DEBUG=true
APP_KEY=base64:somekeyhere=
APP_URL=http://localhost

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=erptenants
DB_USERNAME=root
DB_PASSWORD=

CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_DRIVER=smtp
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
\Config::set('database.connections.tenant.host', env('DB_HOST', $tenant ->host));