如何在配置文件中进行数据库查询?

How to make database query inside a config file?

我正在努力弄清楚如何在 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

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

感谢您的帮助!

您有一个原始 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();

这应该可以做到。

在您的 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() 参数中的键可以是任何你想要的。

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

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

$this->app['config']->put('database.connections.mysql.version', $result->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->all() 的 dd 提供了一种简单的方法来检查值是否已按预期设置。

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