Laravel 5.4:创建数据库并在其上运行Artisan :: call('migrate')

时间:2017-09-08 10:05:02

标签: laravel laravel-5

我正在尝试为我的应有项目编写一个简单的向导安装2天,而且我现在对一个我无法解决的问题感到疯狂。

需要
我正在开发一个sorta向导。此向导会询问常用的数据库设置:主机,端口,用户名,密码和数据库名称 我被要求创建一个名称来自表单的数据库,并使用常规文件中定义的迁移和种子填充它。 我不能使用RachidLaasri github项目,因为规格不能接受它。

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

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

 // 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值上完成 我没有解决方案,我不知道该尝试什么 谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

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