Eloquent 単独で COUNT(*) を使用したいが DB:raw() を使用すると A facade root has not been set. エラーになる

経緯

Eloquent 単独利用しているプログラムの中で COUNT(*) を使用したくなったのでその方法をメモ。

単純に件数をカウントしてその数値を使いたいだけであれば

$data_count = $dbConnect->table('hoge')
              ->count();

で済ませることができます。が、今回はサブクエリとして使用した方がコード的にすっきりしそうな状況でした。

先の方法ではコード上は関連性のない別のクエリをもう1つ記述しなければならないので如何なものかと思い……。

調査

検索したところ、 SQL で COUNT(*) を使用する場合は DB:raw() を使うとのこと。

ただし、 Laravel の中ならばいざ知らず今回は Eloquent 単独使用なので、 DB なるクラスはどこから来るのか……となってしまいました。しかも ::raw() は static メソッドですし。

引き続き検索すると、 DB はファサードでした。

しかし、 Laravel 公式のサンプルのように

use Illuminate\Support\Facades\DB;

を追加すると、

A facade root has not been set.

というエラーが発生して怒られてしまいます。

通常の Laravel 内で使用する場合はインスタンスとの紐付けが上手く行われますが、今回は Eloquent のみの単体使用なのでこのパターンではできそうにないように見受けられました (できたとしても素直に Laravel を使った方が早そう)。

最終的には

この記事の方法で

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

DB::raw() を使うクラスのファイルの中で再度読み込ませる (別のファイルでDB接続用のインスタンスを生成していて、それを DI していたので今回は「再度読み込ませる」という表現) ことで乗り越えることができました。

参考

count()

DB::raw()

A facade root has not been set. エラー

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。