2017-09-08 178 views
0

它过2次天,我试着写我的项目,由于一个简单的向导安装,目前我要疯了一个问题我解决不了。Laravel 5.4:创建数据库和运行工匠::调用(“迁移”)

需要
我正在开发一个sorta向导。该向导要求提供常用的数据库设置:主机,端口,用户名,密码和数据库名称。
我要求创建一个数据库的名字来源于形式,并与通常的文件中定义的迁移和种子填充它。
我不能使用RachidLaasri GitHub的项目,因为规格不能接受。

什么工作
到目前为止,我设法创建一个数据库,使用低级别的连接(使用新的\的mysqli)。这一步是必需的,因为我们需要测试连接的每一步以返回适当的错误消息。
然后,我重写与参数校正证明,包括数据库名.ENV。到现在为止还挺好。

问题
除了当我运行Artisan::call('migrate'),它运行在以前的数据库名称(一个在.ENV重写之前)。我尝试了我找到的所有东西,但无法找出解决方案。
所以,现在有点我的代码,simplifed的可读性:

// Try connection with provided settings 
     $dbHost = $request->get('db_host'); 
     $dbPort = $request->get('db_port'); 
     $dbName = $request->get('db_name'); 
     $dbUsername = $request->get('db_username'); 
     $dbPassword = $request->get('db_password'); 

     try { 
      $dbConnection = new \mysqli($dbHost, 
       $dbUsername, 
       $dbPassword, 
       '', 
       $dbPort 
      ); 
     } catch (\Exception $e) { 
      return redirect()->back() 
       ->withInput($request->all()) 
       ->withErrors(['general' => trans('wizard.errors.dbInit') . $e->getMessage()]); 
     } 

     // Create database 
     $sql = 'CREATE DATABASE ' . $dbName . 
      ' CHARACTER SET utf8 COLLATE utf8_bin'; 
     $queryResult = $dbConnection->query($sql); 
     // [...] Handling errors 
     $dbConnection->close(); 

     // Writing .env file 
     // [...] Checking and replacing params, writing file, catching errors 

     // Executing artisan commands to create tables, and populate them with mandatory data 
     Artisan::call("config:clear"); 

     // Setting the config to use the newly created database 
     Config::set('database.connections.mysql.database', $dbName); 
     // DB::select('USE ' . $dbName); // Throws : General error: 1 near "USE": syntax error (SQL: USE dbname) 

     Artisan::call('migrate'); 
     Artisan::call('db:seed'); 
     dd('STAHP'); // TODO debug 
     return redirect()->route('wizard.step2'); 

迁移和种子从.ENV文件来以前DB_DATABASE值一直在做。
我出的解决方案,我不知道什么尝试。
感谢您的帮助。

回答

0

当laravel启动时,它将.env和所有config/文件加载到内存中,写入任何一个都不会影响任何正在运行的laravel进程。