概要
laravelでDBから情報を取得したいときの方法は、DBファサードを使う方法とモデルを使う方法がある。それぞれどのような違うがあるのか簡単にまとめてみる。
本記事で取り上げる意外にもおそらく差分は存在するが思いつくものだけをメモ的にざっくりまとめてみようと思う。
前提
便宜上「インスタンス」という言葉を多用するが、インスタンスそのものが何であるかは今回は重要ではない。実際とは若干異なるかもしれないが「データの集合を入れておく箱」と思っていただいて問題ない。
DBファサード
記載例
ユーザーテーブルの全情報を取得したい場合、下記の様に記載する。下記をtinkerで実際に実行してみる。
use Illuminate\Support\Facades\DB;
$user = DB::table('users')->where('id', 1)->first();
var_dump($user);
$user
の変数には、プロパティにユーザーのレコード情報を格納したstdClass
というクラスのインスタンスが格納される。
モデル
記載例
ユーザーテーブルのidが1のユーザー情報を取得したい場合、下記の様に記載する。下記をtinkerで実際に実行してみる。
use App\Models\User;
$user = User::find(1);
var_dump($user);
$user
の変数には、プロパティにユーザーのレコード情報を格納したUser
というモデルクラスのインスタンスが格納される。
ざっくりまとめ
二種類の取得方法で大きな違いは、「レコード情報郡が入っている箱(インスタンス)」である。
下記の様にインスタンスに違いがある
- DBファサード → stdClassのインスタンス
- モデル → Userモデルクラスのインスタンス
この二種類のインスタンスがどのくらい差があるかというと、無印良品の「シンプルな筆箱」と小学生御用達の「多機能筆箱」くらい差がある。
ちなみに「DBファサード → stdClassのインスタンス」が無印良品の「シンプルな筆箱」で「モデル → Userモデルクラスのインスタンス」が「多機能筆箱」である。
「シンプルな筆箱」は鉛筆を入れておく以外の機能を持たない。
逆に「多機能筆箱」は鉛筆削りがあったり、鉛筆ホルダーがあったり、何かと便利な機能が入っている。
ただし、「筆記用具を入れておける・取り出して使える」という部分はどちらの筆箱でも共通している。これはlaravelのデータ取得にも言えることで、極論をいうとこの共通のできることを満たしたいならどっちを使っても良い。
しかし、どちらの筆箱にも適材適所は存在するようにデータ取得でも得手不得手は存在する。
利点を簡単にまとめる。 下記以外にももちろんたくさんある。
- DBファサード
- ただ単に指定テーブルのレコード情報だけが手っ取り早くほしい。
- 実行するSQLを引数で渡したい。
- モデル
- 関連テーブルのレコード情報もほしい。(※別途、モデルクラス内部にリレーションメソッドの定義は必要)
- 取得したレコード情報をモデルクラスで定義されているメソッド使って加工したい。
「laravelでレコード情報を取得する」と言ったら基本モデルを使う(気がする)
ここまで長々と説明してきたが、基本的にlaravelでレコード情報を取得する場合はモデルクラスを使うと思って良いのではないだろうか。
DBファサードは「モデルクラスでは実現できない複雑なSQLを実行する」ときや「モデルのインスタンスを作るほどでも無いテストコード」など、使用箇所は限定されている気がする。
DBのI/Oにモデルを使うとここでは書ききれないほどの利点がある。(キャスト、一括insertのキー許可、データ型、、、などなど)
若干使いこなせるまではストレスが有るかもしれないが、後々楽になってくるのでモデルを使うほうがよいと感じる。
参考文献