Я изо всех сил пытаюсь выяснить, как я могу сделать запрос к базе данных внутри файла конфигурации 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
Как я могу убедиться, что этот запрос приводит к выводу и устранить эту ошибку?
Спасибо за любую помощь!
Оставьте значение по умолчанию или нулевое значение в вашем 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()
Аргумент может быть любым, что вы хотите.
Я опробовал ответ @ 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 за то, что поставили меня на правильный путь 🙂
У вас есть сырой запрос 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();
Это должно сделать это.