laravelとSQL
・Laravelでは、SQLクエリを生成するためのビルダークラスが用意されています。ビルダークラスを使用することで、SQLクエリを手動で記述することなく、PHPコードでデータベース操作を行うことができます。ビルダークラスは、SELECT、INSERT、UPDATE、DELETEなどのSQL文を生成することができます。
また、LaravelではEloquentというORM(Object-Relational Mapping)も提供されています。ORMを使用することで、SQLを直接記述することなく、PHPのオブジェクトとしてデータベース操作を行うことができます。Eloquentは、データベースのテーブルをPHPのクラスとして表現することで、テーブル操作を簡単に行うことができます。Eloquentを使用することで、SQLに比べて柔軟性が高く、コードの可読性も向上するといったメリットがあります。
・どちらで方法で書くべきか?
Eloquent ORM は、Laravel フレームワークのデフォルトの ORM であり、モデルを使用してデータベーステーブルを操作することができます。そのため、Eloquent モデルを使用することで、SQL クエリを直接書くことなく、より簡潔なコードでデータベーステーブルの操作ができます。例えば、以下のように Eloquent モデルを使用してデータベーステーブルのレコードを取得することができます。
一方、直接 SQL クエリを書く場合は、DB ファサードを使用してデータベースにアクセスすることができます.
どちらの方法を使うかは、プロジェクトの要件や開発者の好みによって異なります。(Eloquent モデルは、データベーステーブルをオブジェクトとして扱えるため、より直感的なコードが書けます。一方で、複雑な SQL クエリを書く場合には、直接 SQL クエリを書いた方がシンプルに書けることがあるため、適宜使い分けることが重要です。)
今回は、直接 SQL クエリを場合をまとめる。
テーブルの全件取得
DB::table('users')->get();
特定のカラムのみ取得
DB::table('users')->select('name', 'email')->get();
WHERE句
:SELECT文の条件式を指定するための句で、指定した条件に該当する行のみを抽出できる。例、WHERE age >= 18 とすることで、18歳以上の行だけを取得できる
DB::table('users')->where('name', 'John')->get();
DB::table('users')
->where('name', 'John')
->orWhere('name', 'Jane')
->get();
COUNT関数
:指定された列の行数を取得するための関数です。例えば、SELECT COUNT(*) FROM usersとすることで、usersテーブルの全行数を取得することができます。
DB::table('users')->count();
MAX関数
:最大値の取得
DB::table('users')->max('votes');
ORDER BY句
:SELECT文で取得する行をソートするための句であり、指定された列を昇順・降順に並べ替えられる。例えば、SELECT * FROM users ORDER BY age DESCとすることで、年齢の降順にソートしたusersテーブルを取得できる。
DB::table('users')->orderBy('age', 'desc')->get();
AVG関数
:平均値の取得
DB::table('users')->avg('votes');
GROUP BY句
:指定された列の値でグループ化して集計するための句で、集計関数と併用することが一般的です。例、SELECT gender, COUNT(*) FROM users GROUP BY genderとすることで、男女別のユーザー数を取得できる。
DB::table('users')
->groupBy('account_id')
->having('account_id', '>', 100)
->get();
HAVING句
:GROUP BY句でグループ化した結果に対して条件式を指定するための句で、WHERE句と同様に条件に該当するグループのみを抽出できる。例えば、SELECT gender, COUNT() FROM users GROUP BY gender HAVING COUNT() > 10とすることで、ユーザー数が10人以上の性別だけを取得できる。
DB::table('users')
->select('gender', DB::raw('COUNT(*) as count'))
->groupBy('gender')
->having('count', '>', 10)
->get();
usersテーブルからデータを取得しています。select()メソッドでgenderカラムと、COUNT(*)で集計した結果を取得しています。groupBy()メソッドでgenderでグループ化し、having()メソッドでカウント結果が10以上の行だけを抽出しています。最後に、get()メソッドでクエリを実行して結果を取得します。
JOIN句
:複数のテーブルを結合するための句であり、INNER JOIN, LEFT JOIN, RIGHT JOINなど様々な種類がある。例、SELECT * FROM users INNER JOIN orders ON users.id = orders.user_idとすることで、usersテーブルとordersテーブルをユーザーIDで結合した結果を取得することができる。
DB::table('users')
->join('orders', 'users.id', '=', 'orders.user_id')
->select('users.*', 'orders.price')
->get();
INNER JOIN句
:内部結合
DB::table('users')
->join('contacts', 'users.id', '=', 'contacts.user_id')
->join('orders', 'users.id', '=', 'orders.user_id')
->select('users.*', 'contacts.phone', 'orders.price')
->get();
LIKE
:文字列を部分一致で検索するための条件式。例、商品名が「りんご」であるレコードを検索するとき、「%りんご%」と指定することで、「りんご」が含まれる商品名を持つレコードを検索できる。
$keyword = 'りんご';
$products = Product::where('name', 'like', '%'.$keyword.'%')->get();
BETWEEN
:指定した範囲内に該当する値を検索するための条件式。例、価格が10,000円以上20,000円未満の商品を検索するとき、「BETWEEN 10000 AND 20000」と指定することで、価格が10,000円以上20,000円未満の商品を検索できる。
$products = Product::whereBetween('price', [10000, 20000])->get();
Productは検索対象のテーブル名、priceは検索するカラム名です。whereBetweenメソッドは、指定したカラムが指定した範囲内にあるレコードを取得するメソッドです。最後に、getメソッドを使用することで、検索結果を取得します。
----作成途中-------
IN
:複数の値に一致するレコードを検索するための条件式。例、商品カテゴリーが「フルーツ」または「野菜」であるレコードを検索するとき、「IN ('フルーツ', '野菜')」と指定することで、商品カテゴリーが「フルーツ」または「野菜」のレコードを検索できまる。
$items = DB::table('table_name')
->whereIn('column_name', ['フルーツ', '野菜'])
->get();
ビュー
:データベース上のテーブルを参照して作成される仮想的なテーブルのこと。ビューは、SELECT文を用いて作成される。ビューを利用することで、複数のテーブルを結合して一つのテーブルとして扱ったり、必要なカラムのみを表示することができる。
サブクエリ
:SELECT文の中に入れたSELECT文のこと。サブクエリを使うことで、複雑な検索条件を表現したり、集計した結果を条件にすることができる。
スカラサブクエリ
:サブクエリの中で1つの値を返すように設計されたサブクエリのこと。スカラサブクエリは、比較演算子を使った条件式の右辺に使用することができまる。例えば、「SELECT COUNT(*) FROM table1」などがスカラサブクエリの例。
UNION句:複数SELECT文の結合
$first DB::table('users')
->whereNull('first_name');
$users = DB::table('users')
->whereNull('last_name')
->union($first)
->get();