【Laravel】Laravelでのクエリの書き方

Laravelは、PHPフレームワークの中でも特に人気が高く、開発効率を大幅に向上させることができます。その中でも、データベースとやり取りを行うためのクエリは、Webアプリケーションの開発において欠かせない要素です。しかし、データベースクエリを直接SQLで書くことは、保守性や可読性の面で難しくなることが多く、初心者にとっても複雑に感じる場合があります。

そこで、Laravelでは「クエリビルダ」や「DBファサード」、さらに「Eloquent ORM」といった強力なツールを提供しており、これらを活用することで、シンプルで読みやすいクエリを簡単に書くことができます。この記事では、Laravelで効率的かつ柔軟にクエリを記述するための方法を、クエリビルダを中心に基本から段階的に解説していきます。

この記事の内容は以下のような方向けです。

  • Laravelでのデータベース操作に不慣れな方
  • クエリビルダを使ってSQLのようなクエリを効率よく書きたい方

Laravelでのクエリの基本

Laravelでは、「データベースとやり取りするためにいくつかの方法が提供されています。その中でも、代表的なものが「クエリビルダ」と「DBファサード」です。これらはデータベースクエリを直感的に書けるようにデザインされており、従来のSQLの知識があれば比較的簡単に使いこなすことができます。

クエリビルダ

クエリビルダは、Laravelの提供する一連のメソッドを利用して、SQLクエリを構築するための強力なツールです。SQL文を直接各代わりに、メソッドチェーンを使って簡潔かつ読みやすいクエリを作成することができます。例えば、usersテーブルからすべてのレコードを取得する場合、クエリビルダでは以下のように書きます。

$users = DB::table('users')->get();

上記のコードは、SQLの SELECT * FROM users; に相当します。SQL文に比べて読みやすく、複雑なクエリもシンプルに構築できるのが特徴です。

DBファサード

DBファサードは、SQLを直接記述したいときに使用できるインターフェースです。生のSQLを実行するため、柔軟性が高く、クエリビルダよりも直感的な操作が可能です。たとえば、上記と同じクエリをDBファサードで実行する場合、次のようになります。

$users = DB::select('SELECT * FROM users');

DBファサードは、クエリビルダの便利さを犠牲にして、SQLの完全な制御ができるようになるため、特殊なクエリやパフォーマンス調整が必要な場合に役立ちます。

ファサードについてはこちらでも解説しています。

ここでは、Laravelの代表的なツールであるクエリビルダをメインに紹介していきます。

クエリビルダの基本的な使い方

クエリビルダを使って基本的なクエリをどのように書くかを具体的なコードを例とともに紹介していきます。

データを取得する

データベースからデータを取得する最も基本的な操作は get() メソッドを使うものです。例えば、users テーブルからすべてのユーザを取得する場合は、以下のように記述します。

$users = DB::table('users')->get();

このクエリは、SQLの SELECT * FROM users; に相当し、すべてのユーザデータを取得します。取得されたデータはコレクション形式で返されます。

単一のレコードを取得する

すべてのレコードを取得するのではなく、特定の1件だけを取得したい場合は、 first() メソッドを使います。例えば、最初のユーザを取得するには次のように書きます。

$user = DB::table('users')->first();

これは、SQL(PostgreSQL)でいう LIMIT 1 に相当し、最初のレコードのみを返します。また、find() メソッドを使って主キーを指定して特定のレコードを取得することも可能です。

$user = DB::table('users')->find(1);

このコードは、id が1であるユーザを取得しています。find() は主キーをもとにデータを取得するため、簡潔で使いやすいメソッドです。

条件付きクエリ

特定の条件に基づいてデータを取得する場合、where() メソッドを使用します。例えば、age カラムが20歳以上のユーザを取得する場合、次のように記述します。

$users = DB::table('users')->where('age', '>=', 20)->get();

このクエリのwhere() は、SQLのWHERE句に相当し、指定した条件に合致するレコードだけを取得します。また、複数の条件を組み合わせることもできます。

$users = DB::table('users')
    ->where('age', '>=', 20)
    ->where('status', 'active')
    ->get();

特定のカラムだけを取得する

すべてのカラムを取得する必要がない場合は、select() メソッドを使って特定のカラムだけを取得することができます。例えば、nameemail だけを取得したい場合は、次のようにします。

$users = DB::table('users')->select('name', 'email')->get();

上記のようなクエリで、テーブル内の不必要なデータを除外して効率的にデータを取得することができます。

ソートと制限

取得したデータを並び替えたり、取得する件数を制限する場合には、orderBy()limit() を使います。例えば、created_at の降順で最新の5件のユーザを取得するには、次のように記述します。

$users = DB::table('users')
    ->orderBy('created_at', 'desc')
    ->limit(5)
    ->get();

これにより、最新の5人のユーザが返されます。orderBy() は第一引数にカラム名と、第二引数にソートの順序(昇順であればasc、降順であればdesc)を指定することができます。

データの挿入・更新・削除

クエリビルダを使ってデータベースに対しての挿入、更新、削除する操作も簡単に行えます。ここでは、それぞれの基本的な説明をしていきます。

データの挿入

新しいレコードをデータベースに挿入するには、insert() メソッドを使用します。例えば、users テーブルに新しいユーザを追加するには次のように記述します。

DB::table('users')->insert([
    'name' => 'John Doe',
    'email' => 'john.doe@example.com',
    'age' => 30
]);

このクエリは、users テーブルに新しいレコードを挿入し、nameemailage の値をそれぞれ指定します。複数のレコードを一度に挿入する場合は、配列をさらにネストして渡すことが可能です。

DB::table('users')->insert([
    ['name' => 'Jane Doe', 'email' => 'jane.doe@example.com', 'age' => 25],
    ['name' => 'Alice Smith', 'email' => 'alice.smith@example.com', 'age' => 28]
]);

データの更新

既存のレコードを更新するには、update() メソッドを使用します。更新する対象を指定するために、where() メソッドと組み合わせて使用します。たとえば、特定のユーザの名前を更新する場合、次のように書きます。

DB::table('users')
    ->where('id', 1)
    ->update(['name' => 'John Smith']);

このクエリは、id が1であるユーザのname カラムを”John Smith”に更新します。複数のカラムを一度に更新することも可能です。

DB::table('users')
    ->where('id', 1)
    ->update([
        'name' => 'John Smith',
        'email' => 'john.smith@example.com'
    ]);

データの削除

レコードを削除するには、delete() メソッドを使用します。たとえば、id が1であるユーザを削除するには次のように書きます。

DB::table('users')->where('id', 1)->delete();

このクエリは、id が1のレコードをusers テーブルから削除しています。また、すべてのレコードを削除したい場合は、truncate() メソッドというものを使います。

DB::table('users')->truncate();

存在しない場合に挿入し、存在する場合は更新する

これを知っておくと、業務の様々な場面で役立つことがあると個人的に思います。Laravelにはinsert()update() を組み合わせたupdateOrInsert() も用意されています。これは、指定した条件のレコードが存在すれば更新し、存在しなければ新しく挿入します。

DB::table('users')->updateOrInsert(
    ['email' => 'john.doe@example.com'],
    ['name' => 'John Doe', 'age' => 30]
);

email がjohn.doe@example.com のユーザが存在する場合、そのnameage を更新し、存在しない場合は新しいレコードを挿入します。

まとめ

この記事は、Laravelでクエリを効率的に書くための基本的な方法から応用的なテクニックまでを紹介しました。クエリビルダを使うことで、シンプルかつ読みやすいクエリをメソッドチェーンで構築でき、SQL文を直接書く必要がなくなります。

Laravelでは、クエリビルダ、DBファサード、そしてEloquent ORMなど、さまざまな方法でデータベース操作を行うことができるため、プロジェクトの要件に応じて最適なツールを選択することが重要です。クエリビルダのシンプルさと柔軟性は、特に中小規模のアプリケーションで役立ちますが、DBファサードを使うことで高度な制御を必要とする場面にも対応できます。

今後は、この記事で紹介した基本的なテクニックを使いながら、さらに高度なクエリやパフォーマンスの最適化について学ぶことで、Laravelでの開発をより一層効率的に進めることができるでしょう。

コメント