Laravelでデータベース操作をする方法
DBファサード(SQLクエリ)
DBファサード(クエリビルダ)
Eloquent(エロクアント)
ファサード(Facades)とは
ファサードとはクラスをインスタンス化しなくてもメソッドを実行できる機能である。
よく利用されるファサードとしてルーティングのweb.phpではRouteファサード、データベース操作で利用するDBファサード、Authファサードなどがある。
これらのファサードはconfig/app.phpのaliasesで定義されている。
クエリビルダとは
DBファサードのDBクラスには「クエリビルダ」という機能が備わっている。
クエリビルダとは様々なメソッドをメソッドチェーンとして連続して呼び出してSQLクエリ文を生成する機能である。
DBファサードとは
DBファサードとはデータベース操作に必要な機能をまとめたクラスのファサードである。Illuminate\Support\Facadesに用意されているファサードであり、クラス名は「DB」である。
DBクラスは以下構文に沿って利用する。
$変数 = DB::メソッド
クエリビルダの使用方法
- DBファサードをuseする
DBファサードを利用する場合、必ずスクリプトにDBファサードをuse文で読み込んでおく。
use Illuminate\Support\Facades\DB;
- 基本的なクエリビルダの使い方
クエリビルダは以下のように、DB:table(テーブル名)で始まり、そのあとはメソッドチェーンを連続して呼び出して必要なSQLクエリを作成する。
$blogs = DB::table('blogs')
->where('title', 'Laravel')
->orderBy('contents', 'asc')
->get();
- ビルダの取得:table()
クエリビルダを利用する場合、まず最初にDBクラスのtable()メソッドを呼び出し、tableメソッドにより「ビルダ」を取得し、その後はビルダに備わっているメソッドを呼び出していく(メソッドチェーン)ことで、SQLクエリ文が生成される。
$blogs = DB::table('blogs')
->where('title', 'Laravel')
->orderBy('contents', 'asc')
->get();
- レコードの取得:get()
レコードを取得するメソッドの一つにget()メソッドがある。
get()メソッドはクエリの結果からレコードを取得するメソッドであり、SQLのselect文に相当する。そのためクエリ結果のすべてのレコードを返す。get()メソッドの戻り値はコレクションである。
$blogs = DB::table('blogs')->get('title', 'contents'));
- 最初のレコードを取得:first()
クエリ結果から最初のレコードのみを取得するにはfirst()メソッドを使用する。返すレコードは1つのみなので、戻り値はそのレコードのオブジェクトとなる。first()メソッドはwhere()メソッドなどと共に利用され、クエリ結果が1つのレコードのみであることがわかっている場合に利用されることが多い。
$blog = DB::table('blogs')->where('title', 'Laravel')->first();
return $blog->contents;
- 単一のフィールド値のみ取得:value()
クエリ結果から単一のフィールド値のみ取得するにはvalue()メソッドを使用する。value()の引数には取得したいフィールドを指定する。
$contents = DB::table('blogs')->where('title', 'Laravel')->value('contents');
- idから単一のレコードを取得:find()
指定したidと一致する単一のレコードを取得するにはfind()メソッドを使用する。引数にidを指定することで、idと一致するレコードが返される。
$blog = DB::table('blogs')->find(54);
- 指定したカラムの取得:select()
select()メソッドは指定したカラムの値を取得するメソッドである。
SQLのselectに相当する。
$users = DB::table('users')
->select('id', 'name', 'age')
->get();
- カラムの値をすべて取得:pluck()
特定のカラム(フィールド)の値をすべて取得するにはpluck()メソッドを使用する。引数には取得したいフィールド名を指定し、指定したフィールドの値をコレクションとして返します。返された値は以下のようにforeachで処理することもできる。
$users = DB::table('users')->pluck('name');
foreach ($users as $user) {
echo $user;
}