Help us understand the problem. What is going on with this article?

Laravelのクエリビルダについて 全件/1カラム/複数カラム/1レコード取得、集計メソッド、存在確認、SELECT(基本)

LaravelのEloquentを使ってあれこれ行うに当たり、以下のような公式ドキュメントの助言を受け、
クエリビルダで使用できる全メソッドを確認することにしました。

Eloquentモデルはクエリビルダですから、クエリビルダで使用できる全メソッドを確認しておくべきでしょう。Eloquentクエリでどんなメソッドも使用できます。

今回は前編とし、残りはまた今度追記するか別で書きます。

クエリビルダとは

SQLに詳しくなくても、データベースにアクセスするためのクエリを生成してくれる機能。
クエリを記述するには、DBファサードのtable()メソッドを使用する。
table()は引数に渡されたテーブルに対するクエリビルダインスタンスを返すので、それを使ってクエリに制約を加えることができる。
最終的な結果を取得するチェーンをつなげてクエリの結果を取得する。

全件取得

get()で、全件取得

// usersテーブルの全レコードを取得
$users = DB::table('users')->get();

get()はstdClassオブジェクトのインスタンスを結果として含む、collectionを返す。

collectionはforeachで回すことができて、オブジェクトのプロパティとして、各カラムの値にアクセスすることができる。

foreach ($users as $user) {
    echo $user->name;
}

1カラム/1レコード取得

first()で、1レコードのみを取得

戻り値: stdClassオブジェクト

// usersテーブルから、nameカラムがJohnのレコードを1レコードのみ取得
$user = DB::table('users')->where('name', 'John')->first();

value()で、1カラムのみを取得

// usersテーブルから、nameカラムがJohnのレコードのうち、emailカラムの値を取得
$email = DB::table('users')->where('name', 'John')->value('email');

※name カラムが John のレコードが複数あったとしても、取得する値は1つ

find()で、IDカラムの値を指定して1レコードのみを取得

// usersテーブルから、idが3のレコードを取得
$user = DB::table('users')->find(3);

複数カラム取得

pluck()で、指定したカラムの値をコレクションで取得

// address_listsテーブルからnameカラムとaddressカラムの値をコレクションで取得
$namesAndAddresses = DB::table('address_lists')->pluck('name', 'address');

$addresses = [];
$names = [];

foreach ($namesAndAddresses as $name => $address) {
    // $namesに、$namesAndAddressesのnameが配列で格納される
    $names[] = $name;
    // $addressesに、$namesAndAddressesのaddressが配列で格納される
    $addresses[] = $address;
}

集計メソッド

count()で、レコードの件数を取得

戻り値: int

// usersテーブルのレコード件数を取得
$recordCount = DB::table('users')->count();

max()で、指定したカラムの最大値を取得

// usersテーブルのageカラムの最大値を取得
$oldest = DB::table('users')->max('age');

min()で、指定したカラムの最小値を取得

// usersテーブルのageカラムの最小値を取得
$youngest = DB::table('users')->min('age');

avg()で、指定したカラムの平均値を取得

// usersテーブルのageカラムの平均値を取得
$average = DB::table('users')->('age');

sum()で、指定したカラムの合計値を取得

// usersテーブルのageカラムの合計値を取得
$sum = DB::table('users')->('id');

レコードが存在するか判定するメソッド

以下のメソッドで、クエリの制約にマッチするレコードが存在するか否かを調べることができる。

exists()で、指定したレコードが存在するか調べる

戻り値: 存在する場合true、存在しない場合false

// usersテーブルのnameカラムがJohnのレコードが存在するか判定
$existsOrNot = DB::table('users')->where('name', 'John')->exists();
if ($existsOrNot) {
  // 存在する
} else {
  // 存在しない
}

doesntExist()で、指定したレコードが存在しないか調べる

戻り値: 存在しない場合true、存在する場合false

// usersテーブルのnameカラムがMarkのレコードが存在しないかどうか判定
$nonExsistOrNot = DB::table('users')->where('name', 'Mark')->doesntExist();
if ($nonExsistOrNot) {
  // 存在しない
} else {
  // 存在する
}

SELECT節の指定

select()を使って、取得するカラムを指定できる。

// usersテーブルの、name、email(user_emailという名前で取得)カラムの全レコードを取得
$users = DB::table('users')->select('name', 'email as user_email')->get();

既に存在するクエリビルダインスタンスのSELECT句にカラムを追加したい場合は、addSelect()を使って追加できる

// usersテーブルのnameカラムを取得するクエリビルダインスタンスを作成
$query = DB::table('users')->select('name');

// 上記クエリビルダに、ageカラムも取得するように追加
$users = $query->addSelect('age')->get();
mackeyTA
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away