Slim Framework 2でEloquentをスタンドアロンパッケージとして正常に使用しています。
しかし、2つのテーブルから情報を取得し、次のようにデータベースからLeft JoinとCounterを使用して統計を表示する必要があるため、Illuminate\Support\Facades\DBを使用したいと思います。
_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
_
どうすれば解決できますか?
これまでのところ、 このリンク で、新しいアプリコンテナを作成し、それをFacadeにバインドする必要があることがわかりました。しかし、私はそれを機能させる方法を見つけていません。
これが、Eloquentの残りの部分を開始し、正常に動作する方法です。
_use Illuminate\Database\Capsule\Manager as Capsule;
$capsule = new Capsule();
$capsule->addConnection([
'my' => $app->config->get('settings'),
/* more settings ...*/
]);
/*booting Eloquent*/
$capsule->bootEloquent();
_
どうすれば修正できますか?
修正済み@ 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();
_
コードを次のように変更する必要があります。
$Capsule = new Capsule;
$Capsule->addConnection(config::get('database'));
$Capsule->setAsGlobal(); //this is important
$Capsule->bootEloquent();
そして、クラスファイルの最初にインポートする必要があります。
use Illuminate\Database\Capsule\Manager as DB;
Bootstrap/app.phpで$app->withFacades();
のコメントを外すことでこの問題を解決しました。
App.phpでコメント解除してみてください$app->withFacades();
誰かが答えが役に立たないとマークした理由が、私にとっては完璧に機能しました。私は_use Illuminate\Support\Facades\DB as DB;
_を使用していましたが、slimでグローバル$capsule->setAsGlobal();
としてカプセルを設定した後、これは_use Illuminate\Database\Capsule\Manager as DB;
_で動作しました。
最近、Homestead&VirtualBox環境でLaravelをアップグレードした場合、または原因となる理由が見つからない場合は、Vagrantが最新であることを確認してください。
私はテイラーにこのスレッドをロックさせました。過去のいくつかの返信は、Virtualbox 6.xにアップグレードするという解決策を再表明しました。スレッドは、関連していない他の問題がここでドッグパイルされるのを防ぐためにロックされています。