2022-06-09に投稿

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. エラー

Originally published at labor.ewigleere.net
ツイッターでシェア
みんなに共有、忘れないようにメモ

arm-band

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

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント