对于几个控制台命令,我需要更改数据库,以便我所有的雄辩命令和查询都在正确的数据库(和服务器)上运行。
我见过几个解决方案,最简单的似乎就是更改配置:
$new_connection = [
'driver' => 'mysql',
'host' => '127.0.0.1',
'database' => 'test_db',
'username' => 'test',
'password' => 'test',
'charset' => 'utf8',
'collation' => 'utf8_general_ci',
'prefix' => '',
'strict' => false
];
config(['database.connections.mysql' => $new_connection]);
DB::purge('mysql');
唯一的问题(我注意到的)是当我尝试进行交易时,更具体地说,当我在Codeception中的验收测试中进行交易时 - 他们根本不工作。
我使用的命令是:
DB::connection()->beginTransaction(); // inside the _before function
和
DB::connection()->rollBack(); // inside the _after function
答案 0 :(得分:6)
您必须创建2个区别连接
http://fideloper.com/laravel-multiple-database-connections https://laravel.com/docs/5.1/database#accessing-connections
return array(
'default' => 'mysql',
'connections' => array(
# Our primary database connection
'mysql' => array(
'driver' => 'mysql',
'host' => '127.0.0.1',
'database' => 'test_db',
'username' => 'test',
'password' => 'test',
'charset' => 'utf8',
'collation' => 'utf8_general_ci',
'prefix' => '',
'strict' => false
),
# Our secondary database connection
'mysql2' => array(
'driver' => 'mysql',
'host' => '127.0.0.1',
'database' => 'test_db_2',
'username' => 'test',
'password' => 'test',
'charset' => 'utf8',
'collation' => 'utf8_general_ci',
'prefix' => '',
'strict' => false
),
),
);
现在,当您想要查询时,您必须传递所需的连接
$users = DB::connection('mysql2')->select(...);
由于默认声明为mysql,因此可以省略它。
答案 1 :(得分:2)
我遇到了类似的问题。要使用该交易,您基本上需要使用@Sylwit的方法。
创建所需的数据库连接。让我们说mysql
和mysql1
。
现在在您的控制器中获取与所需数据库的连接,如下所示:
$connection = DB::connection('mysql1'); // replace this to your required connection name
现在,对于事务使用检索到的连接。
$connection->beginTransaction(); // inside the _before function
和
$connection->rollBack(); // inside the _after function
或强>
在您的代码中,您只需添加连接名称:
DB::connection('mysql1')->beginTransaction(); // inside the _before function
和
DB::connection('mysql1')->rollBack(); // inside the _after function
答案 2 :(得分:2)
您可以将带有连接名称的字符串作为参数传递给DB :: connection()外观。
https://laravel.com/docs/5.3/database#using-multiple-database-connections
答案 3 :(得分:1)
如果您使用的是phpunit,请查看phpunit.xml
在底部你应该看到以下
<php>
<env name="APP_ENV" value="testing"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="QUEUE_DRIVER" value="sync"/>
</php>
您可以为要使用的测试数据库分配env变量,而不是原始生产数据库。
所以创建两个连接,在.env中分配数据库连接名称,并在phpunit.xml中引用测试一个 祝你好运。
答案 4 :(得分:1)
$config = config()->all();
$config['database']['connections']['mysql'] = $newConnection;
Artisan::call('config:clear');
config($config);
我对此进行了测试并完成了工作