Как сделать запрос к базе данных внутри файла конфигурации?

Я изо всех сил пытаюсь выяснить, как я могу сделать запрос к базе данных внутри файла конфигурации 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

Решение

Оставьте значение по умолчанию или нулевое значение в вашем 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() Аргумент может быть любым, что вы хотите.

3

Другие решения

Я опробовал ответ @ jfadich и обнаружил, что для меня это не совсем решает проблему (уровень 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() дал простой способ проверить, что значения были установлены, как предполагалось.

Большое спасибо @jfadich за то, что поставили меня на правильный путь 🙂

2

У вас есть сырой запрос 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();

Это должно сделать это.

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector