在不同数据库上的路由模型绑定

时间:2019-03-16 08:10:47

标签: laravel

我有多个数据库,并且当模型从路由模型绑定调用时会考虑默认连接,因此表示未找到表。我如何在资源控制器编辑/更新方法中将模型绑定为路由模型绑定的一部分,以考虑当前连接而不是默认连接? PS-我无法在模型上声明$ connection,因为,我不知道在所述时刻它将访问哪个数据库。

1 个答案:

答案 0 :(得分:0)

您可以使用路由中间件来设置特定路由的数据库连接。为此,您需要在数据库配置中设置连接,然后添加中间件。

我在多租户应用程序中使用类似的设置来管理系统与租户数据库的连接。数据库配置:

'connections' => [

   'system' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'lms'),
        'username' => env('DB_USERNAME', 'lms'),
        'password' => env('DB_PASSWORD', 'lms'),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => null,
    ],

    'tenant' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => '',
        'username' => '',
        'password' => '',
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => null,
    ],
],

在我的示例中,中间件强制使用定义为承租人的数据库。

use Closure;
use Illuminate\Support\Facades\Config;

class EnforceTenancy
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        Config::set('database.default', 'tenant');

        return $next($request);
    }
}

然后您可以在kernel.php $ routeMiddleware数组中注册中间件

'tenancy.enforce' => \App\Http\Middleware\EnforceTenancy::class,

,然后将路由文件中的中间件应用于需要第二个数据库的任何路由。