Чрезвычайная ошибка: корень фасада не установлен

Я успешно использовал Eloquent в качестве отдельного пакета в Slim Framework 2.

Но теперь, когда я хочу использовать Illuminate\Support\Facades\DB, так как мне нужно показать некоторые статистические данные, получив информацию из 2 таблиц и используя Left Join и Counter из базы данных следующим образом:

use Illuminate\Support\Facades\DB;
$projectsbyarea = DB::table('projects AS p')
        ->select(DB::raw('DISTINCT a.area, COUNT(a.area) AS Quantity'))
        ->leftJoin('areas AS a','p.area_id','=','a.id')
        ->where('p.status','in_process')
        ->where('a.area','<>','NULL')
        ->orderBy('p.area_id');

Я получаю следующую ошибку:

Type: RuntimeException
Message: A facade root has not been set.
File: ...\vendor\illuminate\support\Facades\Facade.php
Line: 206

Как я могу его решить?

До сих пор я обнаружил в эту ссылку, что мне нужно создать новый контейнер приложения, а затем привязать его к фасаду. Но я не узнал, как заставить его работать.

Вот как я начал остальную часть своего Красноречивого и работающего штрафа:

use Illuminate\Database\Capsule\Manager as Capsule;

$capsule = new Capsule();

$capsule->addConnection([
    'my'         =>  $app->config->get('settings'),
    /* more settings ...*/
]);

/*booting Eloquent*/
$capsule->bootEloquent();

Как это исправить?

Fixed Как сказал @user5972059, мне пришлось добавить $capsule->setAsGlobal();//This is important to make work the DB (Capsule) чуть выше $capsule->bootEloquent();

Затем запрос выполняется следующим образом:

use Illuminate\Database\Capsule\Manager as Capsule;
$projectsbyarea = Capsule::table('projects AS p')
            ->select(DB::raw('DISTINCT a.area, COUNT(a.area) AS Quantity'))
            ->leftJoin('areas AS a','p.area_id','=','a.id')
            ->where('p.status','in_process')
            ->where('a.area','<>','NULL')
            ->orderBy('p.area_id')
            ->get();

Ответы

Ответ 1

Вы должны изменить свой код на:

$Capsule = new Capsule;
$Capsule->addConnection(config::get('database'));
$Capsule->setAsGlobal();  //this is important
$Capsule->bootEloquent();

И в начале вашего файла класса вам нужно импортировать:

use Illuminate\Database\Capsule\Manager as DB;

Ответ 2

Я только что решил эту проблему, раскомментировав $app->withFacades(); в начальной загрузке /app.php

Ответ 3

Попробуйте раскомментировать в app.php $app->withFacades();

Ответ 4

Почему кто-то пометил ответ, который не очень полезен, он отлично работал у меня. Я использовал use Illuminate\Support\Facades\DB as DB;, но это сработало use Illuminate\Database\Capsule\Manager as DB; после установки капсулы как глобального $capsule->setAsGlobal(); в slim.

Ответ 5

Если вы недавно обновили Laravel в среде Homestead & VirtualBox или не нашли причину, вызывающую это, пожалуйста, убедитесь, что ваш Vagrant обновлен.

Referance

Я заставил Тейлора заблокировать эту тему. В последних нескольких ответах было пересмотрено решение, которое заключается в обновлении до Virtualbox 6.x, поток заблокирован, чтобы не допустить, чтобы другие проблемы, не связанные с этим, не были собраны здесь.

Ответ 6

неправильный путь

public function register()
   {
       $this->app->bind('Activity', function($app)
       {
            new Activity;
       });
   }

правильный путь 👍

public function register()
   {
       $this->app->bind('Activity', function($app)
       {
            return new Activity;
       });
   }

---------------------------------- не забудьте вернуться