要解決類似的問題,我用的模型類的性狀。
在我phpunit.xml我有這樣的代碼
<env name="DB_CONNECTION" value="sqlite_testing"/>
<env name="DB_DATABASE" value=":memory:"/>```
在我的config/database.php中的文件我已經建立了爲每個數據庫的連接,以及sqlite_testing連接設置爲測試
'sqlite_testing' => [
'driver' => 'sqlite',
'database' => ':memory:',
'prefix' => '',
],
'mysql_connection_a' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
'mysql_connection_b' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE_B', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
'mysql_connection_c' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE_C', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
然後,我爲每個連接創建一個特徵來設置連接並將它們包含在相關模型中。例如如果用戶模型需要使用mysql_connection_a我會用ConnectionATrait模型
use App\Traits\ConnectionATrait;
class User extends Authenticatable
{
use Notifiable, ConnectionATrait;
的特質會再看看這樣
trait ConnectionATrait
{
/**
* The database table used by the model.
*
* @var string
*/
public function __construct(array $attributes = [])
{
parent::__construct($attributes);
if (env('APP_ENV') != 'testing') {
$this->connection = 'mysql_connection_a';
}else{
$this->connection = 'sqlite_testing';
}
}
}
如果你在測試中使用遷移我也有做類似在遷移文件中使用方法,併爲每個連接使用特徵。
爲我創造一個特質,看起來低於喜歡的mysql_connection_a覆蓋getConnection方法:
trait ConnectionAConnectionTrait
{
/**
* Get the migration connection name.
*
* @return string
*/
public function getConnection()
{
if (env('APP_ENV') != 'testing') {
return 'mysql_connection_a';
}
return 'sqlite_testing';
}
}
然後在遷移它看起來像這樣
use Database\migrations\traits\ConnectionAConnectionTrait;
class CreateUsersTable extends Migration {
use ConnectionAConnectionTrait;
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection($this->getConnection())
->create('users', function(Blueprint $table)
{
你的意思是你有每個MySQL的設置值=的:內存:? – Devon
您可以請發佈一些相關的代碼(測試和配置)? –
您需要發佈您的數據庫配置文件,因爲我假設您考慮使用'DB_DATABASE_1','DB_DATABASE_2'和'DB_DATABASE_3'而不是'DB_DATABASE'做了一些重大修改。 – Devon