Laravel 动态更改连接
Laravel 动态更改连接
如何在控制器中更改Laravel的连接,但连接信息存储在数据库中,例如我的示例:
我在数据库中有一个数据库信息:
id,driver,database_name,username,password,host
所以在我的控制器中只需调用:
$connection = Database::find(1); $users = new Users(); $users->setConnection([ 'driver' => $connection->driver, 'host' => $connection->host, 'username' => $connection->username, 'password' => $connection->password ]); $users = $users->get();
在Laravel中动态更改连接是一个常见的需求,原因可能是需要在运行时根据不同的参数切换到不同的数据库连接。为了解决这个问题,我们可以创建一个辅助函数来实现。
首先,在app/Helpers/DatabaseConnection.php
中创建一个辅助函数setConnection
,该函数接受一个参数$params,用于指定要连接的数据库的驱动、主机、用户名和密码。在函数内部,我们使用config
函数将这些参数配置到database.connections.onthefly
中,然后返回DB::connection('onthefly')
的连接实例。
在控制器的某个位置,我们可以使用use App\Helpers\DatabaseConnection
来引入辅助函数。然后,我们可以通过Database::find(1)
或其他方式获取要连接的数据库的参数,并将其传递给DatabaseConnection::setConnection
函数。最后,我们可以使用返回的连接实例来执行查询操作,如$connection->select(...)
。
需要注意的是,以上代码没有经过测试,但希望可以帮助你解决问题。
更多信息:
- 使用多个数据库:https://laravel.com/docs/5.3/database#read-and-write-connections
- 动态设置配置:https://laravel.com/docs/5.3/configuration#accessing-configuration-values
这个解决方案可以正常工作,感谢原作者的分享,这正是我所需要的。还有一个问题,您是如何选择表名的呢?
没有这个解决方案,我无法想象生活会是什么样子。非常棒的工作,感谢你的帮助,真是救了我的一命。
Laravel动态更改连接的问题产生的原因是需要在不同的情况下切换数据库连接,并且根据不同的连接选择不同的数据表。为了解决这个问题,可以创建一个名为DatabaseConnection的帮助类,其中包含一个静态方法setConnection,该方法接收参数并根据参数动态配置数据库连接。然后在控制器中使用该帮助类来设置连接并执行相应的数据库操作。
具体的解决方法如下:
首先,在App\Helpers命名空间下创建一个名为DatabaseConnection的类。代码如下:
namespace App\Helpers; use Config; use DB; class DatabaseConnection { public static function setConnection($params) { config(['database.connections.onthefly' => [ 'driver' => $params->driver, 'host' => $params->host, 'username' => $params->username, 'password' => $params->password ]]); return DB::connection('onthefly'); } }
然后,在控制器的某个位置使用以下代码来设置连接并执行数据库操作:
use App\Helpers\DatabaseConnection; ... $params['connection_name'] = 'onthefly'; $params['dbname'] ='dbname'; $params['driver'] = 'mysql'; $params['host'] = 'localhost'; $params['username'] = 'root'; $params['password'] = ''; $params['port'] = 3306; $connection = DatabaseConnection::setConnection($params); $getTableData = $connection->table('table_name')->where("column_name",'=','matchCondition')->get();
通过以上方法,我们可以根据需要动态更改数据库连接,同时选择不同的数据表进行操作。