Search code examples
eloquentilluminate-container

Eloquent error: A facade root has not been set


I have been using Eloquent as a standalone package in Slim Framework using this code:

use Illuminate\Database\Capsule\Manager as Capsule;

$capsule = new Capsule();

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

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

But now I want to make use of Illuminate\Support\Facades\DB like this:

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');

But when I run that code I get the following error:

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

So far I have found out, in this link that I need to create a new app container and then bind it to the Facade. But I haven't found out how to make it work.

How do I fix this?


Solution

  • You have to change your Eloquent initialization code to this:

    use Illuminate\Database\Capsule\Manager as DB;
    
    $capsule = new DB();
    
    $capsule->addConnection([
        'my'         =>  $app->config->get('settings'),
        /* more settings ...*/
    ]);
    
    /*booting Eloquent*/
    $capsule->setAsGlobal(); // this is important
    $capsule->bootEloquent();
    

    Then you can use the DB alias just like you would the facade.