我正在努力弄清楚如何在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
如何确保此查询产生输出并解决此错误?
感谢您的帮助!
答案 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();
这应该这样做。