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

时间:2017-05-04 17:15:06

标签: php laravel

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

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

感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

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

php artisan make:provider DatabaseConfigProvider

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

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

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

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

答案 1 :(得分:2)

我尝试了@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让我走上正确的道路:)

答案 2 :(得分:1)

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

这应该这样做。