【问题标题】:How to make database query inside a config file?如何在配置文件中进行数据库查询?
【发布时间】:2017-05-04 17:15:05
【问题描述】:

我正在努力弄清楚如何在 Laravel 配置文件中进行数据库查询。

我目前使用:

<?php
// config/database.php

$results = \Illuminate\Support\Facades\DB::select( \Illuminate\Support\Facades\DB::raw("select version()") );
$mysql_version =  $results[0]->{'version()'};
dd($mysql_version);

return [

...

但我收到的错误是:

RuntimeException in Facade.php line 218:
A facade root has not been set.
in Facade.php line 218
at Facade::__callStatic('raw', array('select version()')) in database.php line 2
at require('/Users/test/code/clooud/config/database.php') in LoadConfiguration.php line 70
at LoadConfiguration->loadConfigurationFiles(object(Application), object(Repository)) in LoadConfiguration.php line 39
at LoadConfiguration->bootstrap(object(Application)) in Application.php line 208
at Application->bootstrapWith(array('Illuminate\\Foundation\\Bootstrap\\LoadEnvironmentVariables', 'Illuminate\\Foundation\\Bootstrap\\LoadConfiguration', 'Illuminate\\Foundation\\Bootstrap\\HandleExceptions', 'Illuminate\\Foundation\\Bootstrap\\RegisterFacades', 'Illuminate\\Foundation\\Bootstrap\\RegisterProviders', 'Illuminate\\Foundation\\Bootstrap\\BootProviders')) in Kernel.php line 160
at Kernel->bootstrap() in Kernel.php line 144
at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 116
at Kernel->handle(object(Request)) in index.php line 57
at require('/Users/test/code/clooud/public/index.php') in server.php line 128

如何确保此查询产生输出并解决此错误?

感谢您的帮助!

【问题讨论】:

  • 在配置文件中保留默认值,然后在 Laravel 启动后创建一个服务提供者来查询数据库,然后从数据库结果中更新配置值。
  • @Philipp 这不起作用,因为它是我正在修改的数据库配置。 jfadich 有效。谢谢:-)

标签: php laravel


【解决方案1】:

在您的config/database.php 文件中保留默认值或空值。创建新的服务提供者(使用 artisan 命令或手动)

php artisan make:provider DatabaseConfigProvider

然后将新的提供程序添加到您的config/app.php 文件中的$providers 数组中。

最后将以下代码添加到boot()方法中。

public function boot()
{
    $result= \DB::select('select version() as version')[0];
    $this->app['config']->put('database.connections.mysql.version', $result->version);
}

put() 参数中的键可以是任何你想要的。

【讨论】:

  • 谢谢,我喜欢这种方式!
  • 我发现这种方法在 5.4 上不太适合我,但我在下面发布了一个修改,似乎可以解决问题,以防它对遇到类似问题的任何人有所帮助:)跨度>
【解决方案2】:

我尝试了@jfadich 的答案,发现它并没有完全解决我的问题(laravel 5.4)。我想这可能是由于不同的 laravel 版本,但修改他的指令我能够得到一些工作。无论如何,如果我的方法有点宽泛,请告诉我,我会修改我的答案。

所以,我在 AppServiceProvicer 本身工作,但您也可以按照之前的建议创建一个新的。

$this-&gt;app['config']-&gt;put('database.connections.mysql.version', $result-&gt;version); 行给了我一个错误(调用未定义的方法 Illuminate\Config\Repository::put())

我翻遍了 Illuminate\Config\Repository 文件,看看它定义了哪些方法,然后找到了一个 set() 方法,这似乎有效。我这样设置我的文件:

//in AppServiceProvider.php

use Illuminate\Contracts\Config\Repository; //allow setting of app config values

public function boot(Repository $appConfig)
{
    $config = CustomConfig::first(); //get the values you want to use
    $appConfig->set('configfile.username', $config->demo_username);
    $appConfig->set('configfile.account', $config->demo_account);
}

我还发现了有用的方法 all() - $appConfig-&gt;all() 的 dd 提供了一种简单的方法来检查值是否已按预期设置。

非常感谢@jfadich 让我走上了正确的道路:)

【讨论】:

    【解决方案3】:

    您有一个原始 SQL 查询,并且您位于配置文件中。在 Laravel 连接数据库之前,必须先解析配置文件。

    你可以简单地用纯php连接到数据库并进行查询。

    这里解释了用纯php连接和查询数据库:https://www.w3schools.com/php/php_mysql_connect.asp

    $conn = mysqli_connect($servername, $username, $password);
    $result = $conn->query('select version() as version');
    $row = $result->fetch_assoc();
    echo $row["version"];
    $conn->close();
    

    应该这样做。

    【讨论】:

    • 在配置加载阶段您根本不应该连接到数据库。最好添加一个服务提供者并从那里加载版本。
    • 理论上这可行,但我在安装向导中使用它进行新安装。所以用户仍在输入数据库信息。
    • 安装向导。!我希望这个脚本可能会有所帮助:github.com/Villvay/veev/blob/master/configure.php 它在一个页面中或多或少地做同样的事情。根据用户输入编写框架配置文件和 .htaccess 文件。验证数据库凭据并将 SQL 转储加载到数据库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 2018-05-15
    • 2013-11-22
    • 2017-06-28
    相关资源
    最近更新 更多