0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

〜エンジニア初学者の開発日記〜 四の巻

Posted at

こんにちは、つかさです
今回はLaravelのクエリビルダについてまとめていこかなと思います。
どうゆうデータが欲しいかによって様々な書き方があるので混乱しがちですが、しっかり理解して整理していきましょう! :sunglasses:
さらに、実際にそのクエリビルダでどのようなSQLが走っているのかも理解できたらなと思っています。

基盤

初めにどのテーブルからデータを取得するのか指定する必要があります。
ここでは仮にUserテーブルからデータを取得するとしましょう。
まず、Illuminate\Support\Facades\DB::table(テーブル名)でusers テーブルのビルダインスタンスを取得します。クラスのインスタンスのような感じで捉えるとわかりやすいかもしれないです。
この時点ではまだデータを取得できていないのでご注意を!

use Illuminate\Support\Facades\DB;

public function getUsers()
{
$users = DB::table('users');
}

DB::table('users')のsql

select * from `users`

データ取得

次に実際にテーブルの中身の取得していきます。
先ほど取得したusers テーブルのビルダインスタンスに対してメソッドを呼ぶことで取得することができます。

getメソッド

  • 結果データの全てを取得します
  • Collectionとして返ってくる
id name email status created_at updated_at
1 John Doe john@example.com active 2024-01-01 10:00:00 2024-01-02 12:00:00
2 Jane Smith jane@example.com active 2024-01-03 14:00:00 2024-01-04 16:00:00
3 Mike Brown mike@example.com inactive 2024-02-01 08:30:00 2024-02-02 09:45:00
$users = DB::table('users')->get();

foreach ($users as $user) {
    echo "ID: {$user->id}, Name: {$user->name}, Email: {$user->email}, Status: {$user->status}\n";
}
ID: 1, Name: John Doe, Email: john@example.com, Status: active
ID: 2, Name: Jane Smith, Email: jane@example.com, Status: active
ID: 3, Name: Mike Brown, Email: mike@example.com, Status: inactive

実行されるSQL

SELECT * FROM users;

DB::table('users')と DB::table('users')->get()SQLの違いについて注意しよう。
2つとも見た目は同じだが、2点異なる。
・1つ目はクエリが実行されているか?
DB::table('users')は実行されておらず、DB::table('users')->get()はされている。
・2つ目は返り値。
 DB::table('users')はクエリビルダのインスタンスに対してDB::table('users')->get()はデータのコレクションになります。

firstメソッド

  • 結果データの最初の 1 件のみを取得します
  • stdClassのオブジェクトとして返ってくる
  • もしデータがない場合はnullが返ります
$users = DB::table('users')->first();

echo "Name: {$user->name}, Email: {$user->email}\n";
Name: John Doe, Email: john@example.com

実行されるSQL

SELECT * FROM users LIMIT 1;

soloメソッド

  • 結果データが必ず 1 件であることを保証して取得します
  • 「結果データが 0 件」「結果データが複数件」の場合は例外がスローされます
  • 1件だけならstdClassのオブジェクトとして返ってくる
$user = DB::table('users')->where('email', 'john@example.com')->solo();

john@example.comを持つレコードは1件なので、stdClassのオブジェクトが取得できます。
別途whereに関しては記載しますが、whereで取得条件を絞ることができます。
ここの例ではemailカラムにjohn@example.comを持つレコードという条件になります。
実行されるSQL

SELECT * FROM users WHERE email = 'john@example.com' LIMIT 2;

ポイント

  • LIMIT 2 を自動的に付けて 2件以上あるかをチェックしている
データが2件以上ある場合
$user = DB::table('users')->where('status', 'active')->solo();

statusカラムにactiveをもつレコードは2件あるので、例外がスローされます。
\Illuminate\Database\MultipleRecordsFoundException

valueメソッド

  • 指定した 1 つのカラムのみを取得します
  • もしデータがない場合はnullが返ります
$userName = DB::table('users')->value('name');

fristメソッドのカラムのみの取得バージョンみたいな感じです。

実行されるSQL

SELECT `name` FROM `users` LIMIT 1

pluckメソッド

  • 指定カラム 1 つだけをコレクションで取得できます
$userName = DB::table('users')->pluck('name');
Illuminate\Support\Collection Object
(
    [items:protected] => Array
        (
            [0] => John Doe
            [1] => Jane Smith
            [2] => Mike Brown
)

実行されるSQL

SELECT `name` FROM `users`;

こっちはgetメソッドのカラムのみの取得バージョンみたいな感じになりますね。

getメソッド同様にCollectionで返ってくるが、getメソッドはCollectionの中にstdオブジェクトだが、plunkメソッドは連想配列なのでご注意を

さらに、コレクションのキーをindexではなくカラムにすることができます。
やり方としては第2引数に対象のカラムを指定します。

$userName = DB::table('users')->pluck('name','status');
Illuminate\Support\Collection Object
(
    [items:protected] => Array
        (
            [active] => John Doe
            [active] => Jane Smith
            [inactive] => Mike Brown
)

実行されるSQL

SELECT `name`, `status` FROM `users`;

existsメソッド

  • 条件に対してレコードが存在するかを確認できます
  • 存在すればtrue、存在しなければfalseが返ってきます
$existsUsers = DB::table('users')->exists();

実行されるSQL

SELECT EXISTS(SELECT * FROM `users`) AS `exists`;

doesntExistメソッド

  • existsメソッドの逆になります
$existsUsers = DB::table('users')->doesntExist();

実行されるSQL

SELECT NOT EXISTS(SELECT * FROM `users`) AS `not_exists`;

toSqlメソッド

  • SQL クエリを文字列として取得を取得することができます

データを取得するわけではないですが、どのようなクエリが実行されているのか確認できるので便利です。以下の例では DB::table('users')の部分のsqlを取得できます。

$existsUsers = DB::table('users')->toSql();
select * from `users`

まとめ

今回はクエリビルダの基盤部分とデータ取得するためのメソッドについて整理しました。普段はsqlを意識せずに取得できてしまいますが、内部でどのようなsqlが実行されているかまで理解することで、より視野が広がると思います。
クエリビルダは範囲が広いので複数の記事で分割して投稿していく予定です。
読んでいただきありがとうございました!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?