web-dev-qa-db-fra.com

Erreur éloquente: une racine de façade n'a pas été définie

J'utilise Eloquent en tant que package autonome dans Slim Framework 2 avec succès.

Mais maintenant que je veux utiliser Illuminate\Support\Facades\DB car je dois montrer des statistiques en récupérant les informations de 2 tables et en utilisant une jointure gauche et un compteur de la base de données, comme ceci:

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

Je reçois l'erreur suivante:

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

Comment puis-je le résoudre?

Jusqu'à présent, j'ai découvert, dans ce lien , que je devais créer un nouveau conteneur d'applications, puis le lier à la façade. Mais je n'ai pas trouvé comment le faire fonctionner.

Voici comment j'ai commencé le reste de mon éloquent et qui fonctionne bien:

use Illuminate\Database\Capsule\Manager as Capsule;

$capsule = new Capsule();

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

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

Comment puis-je réparer ça?

Fixé Comme @ user5972059 l'a dit, je devais ajouter $capsule->setAsGlobal();//This is important to make work the DB (Capsule) juste au-dessus de $capsule->bootEloquent();

Ensuite, la requête est exécutée comme ceci:

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();
32
Pathros

Vous devez changer votre code en:

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

Et au début de votre fichier de classe, vous devez importer:

use Illuminate\Database\Capsule\Manager as DB;
44
user5972059

Je viens de résoudre ce problème en supprimant la mise en commentaire de $app->withFacades(); dans bootstrap/app.php

26
Steven

Essayez de ne pas commenter dans app.php $app->withFacades();

Pourquoi quelqu'un marqué réponse pas utile cela a parfaitement fonctionné pour moi. J'utilisais use Illuminate\Support\Facades\DB as DB; mais cela a fonctionné use Illuminate\Database\Capsule\Manager as DB; après avoir défini la capsule comme globale $capsule->setAsGlobal(); en mince.

7
Shahid Chaudhary

Si vous avez récemment mis à niveau Laravel dans l’environnement Homestead & VirtualBox ou ne trouvez pas la raison qui l’a causé, assurez-vous que votre Vagrant est à jour.

référence

J'avais Taylor verrouiller ce fil. Plusieurs réponses précédentes ont réaffirmé la solution, qui consiste à mettre à niveau vers Virtualbox 6.x, le thread est verrouillé pour éviter que d'autres problèmes non liés soient traités ici.

0
crx4