初心者向けLaravelのDB入門:設定からクエリの基本までわかりやすく解説

はじめに

LaravelはPHPを使ったWebアプリケーション開発のフレームワークとして知られています。 シンプルな文法で書けることや、コードの見通しが良い構造を採用していることで、多くの人に利用されています。 中でもデータベースとのやり取りは、Webサービスを作るうえで必須の機能といえます。 しかし、初めてLaravelを触る皆さんにとっては、どのようにデータベースを設定し、実際のアプリ開発でどのように扱っていくかがわかりにくいかもしれませんね。 そこでこの記事では、Laravelとデータベースを連携させるためのポイントや、よく使われる機能を一通り説明してみます。

この記事を読むとわかること

  • LaravelでDB接続を設定する方法
  • Eloquent ORMでデータを扱う基本
  • クエリビルダで柔軟なクエリを書くコツ
  • マイグレーションやシーダーの実務的な使い方
  • 各種リレーションの設定方法
  • 現場で気をつけたい注意点

Laravelとデータベース接続の概要

Laravelを使うと、設定ファイルを変更するだけで簡単にデータベースと連携ができます。 Webサービスに必要なユーザー管理や投稿機能などを作るには、ほとんどの場合でデータベースの活用が欠かせません。 また、設定ファイルの書き方は統一されているので、異なるデータベースエンジンへ切り替える場合もスムーズでしょう。

DB接続の基本

Laravelでは、データベース接続情報がプロジェクト配下の.envファイルに定義されています。 .envファイルにはデータベースの種類や接続先のホスト名、ポート番号、ユーザー名、パスワードなどを記述します。 これにより、ソースコードを変更することなく、ステージング環境や本番環境で接続先を切り替えられます。 初めて設定するときは、MySQLやMariaDBなどのよく使われるエンジンを指定することが多いです。

.envファイルを使った設定

.envファイルの一例を見てみましょう。 以下のように設定すると、MySQLを利用してデータベースに接続できます。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=laravel_user
DB_PASSWORD=secret

DB_CONNECTION がデータベース種別で、DB_HOSTDB_PORT が接続先ホストとポート番号です。 本番環境とローカル環境で値が異なる場合も、.envファイルを切り替えるだけで対応できるのが便利ですね。

Eloquent ORMの基本

Laravelには Eloquent ORM という仕組みが用意されています。 これは、モデル(Model)と呼ばれるクラスを定義することで、データベースのテーブルをオブジェクトとして扱えるようにする機能です。 テーブル名やカラムの変更があった場合でも、モデルを修正することでプログラム全体とのつながりを保ちやすくなります。 データ操作をシンプルな記述で行えるので、初心者の皆さんにも扱いやすいはずです。

モデルの作り方

モデルは app/Models ディレクトリに配置します。 例えばユーザーテーブルを扱うモデルを作る場合は、以下のようなファイル構成になります。

app
 └── Models
     └── User.php

実際のコード例を示します。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    // テーブル名が単数形なら、protected $table で明示することもある
    // protected $table = 'users';

    // ID以外の主キーを使う場合は$primaryKeyを変更
    // public $primaryKey = 'user_id';

    // タイムスタンプを使わない場合はfalseにする
    // public $timestamps = false;

    // ここでfillableなどを指定する場合もある
    // protected $fillable = ['name', 'email', 'password'];
}

クラス名はテーブル名の単数形を使うことが多いですが、そのままテーブルにマッピングされるわけではありません。 テーブル名が異なるときは、クラス内で $table プロパティを設定すると良いでしょう。

EloquentのCRUD操作

Eloquentを使うと、DB操作を直感的に記述できます。 データの新規作成は Model::create()、取得は Model::find()、更新は Model インスタンスを変更して save()、削除は delete() といった具合です。 一例を示してみます。

// 新規作成
$user = new User();
$user->name = 'Taro';
$user->email = 'taro@example.com';
$user->save();

// 取得(ID指定)
$existingUser = User::find(1);

// 更新
$existingUser->name = 'Jiro';
$existingUser->save();

// 削除
$existingUser->delete();

コードを見てもわかるように、EloquentではSQL文を直接書かずにデータ操作が可能です。 内部的には適切なSQLが生成されるので、テーブル名やカラムをいちいち意識しなくても良いでしょう。

クエリビルダでの操作方法

Eloquentとは別に クエリビルダ という機能も用意されています。 より複雑な検索条件を細かく指定したい場合や、実行速度を優先したい場面では、クエリビルダの方が使いやすい場合があります。 実務ではEloquentとクエリビルダを組み合わせて活用するケースが多いです。

クエリの書き方

クエリビルダを使う場合は、DB ファサードを利用します。 以下のように select, where, orderBy などをチェーンメソッドでつなげて記述します。

use Illuminate\Support\Facades\DB;

// シンプルなSELECT
$users = DB::table('users')->get();

// 条件を指定したSELECT
$activeUsers = DB::table('users')
    ->where('status', 'active')
    ->get();

// 並び替え
$sortedUsers = DB::table('users')
    ->orderBy('created_at', 'desc')
    ->get();

取得結果は配列やコレクションとして返ってくるため、データ加工がしやすいです。 Eloquentでは対応しにくい複雑なJOINやサブクエリも、クエリビルダなら自由度が高い書き方ができます。

集計や結合

データ集計が必要なときには、count, sum, avg といったメソッドも活躍します。 JOINを使いたいときは join メソッドで他のテーブルと結合可能です。 例えば、投稿テーブルとユーザーテーブルを結合して投稿件数を集計する例を挙げます。

$result = DB::table('posts')
    ->join('users', 'posts.user_id', '=', 'users.id')
    ->select('users.name', DB::raw('COUNT(posts.id) as post_count'))
    ->groupBy('users.name')
    ->get();

こうした集計結果を一覧画面に表示することで、ユーザーごとの投稿数を簡単に把握できます。

マイグレーションとシーディングの流れ

データベースのテーブル構造を管理するために、 マイグレーション という仕組みが用意されています。 さらに、テストや開発環境で使うサンプルデータを用意するために シーディング が活用されます。 これらを使うと、チーム開発や環境の再構築でもDBの状態を再現しやすくなります。

テーブル作成の手順

マイグレーションファイルは database/migrations ディレクトリに配置されます。 php artisan make:migration create_users_table のようなコマンドで生成することが多いです。 ファイルを開いてみると、テーブルの構造を up() メソッドで定義できます。

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->string('email')->unique();
        $table->timestamps();
    });
}

マイグレーションを実行すると、上記の通りにテーブルが作成されます。 後からカラムを追加したり、変更したりする場合は、新しいマイグレーションファイルを作成して管理します。

シーダーで初期データを登録

テーブル構造だけでなく、初期データを登録したい場合は シーダー を使います。 シーダーファイルは database/seeders ディレクトリに格納されていて、DatabaseSeeder から呼び出す仕組みです。 ユーザーのテストデータを挿入する例を示します。

public function run()
{
    DB::table('users')->insert([
        [
            'name' => 'Taro',
            'email' => 'taro@example.com',
            'created_at' => now(),
            'updated_at' => now(),
        ],
        [
            'name' => 'Jiro',
            'email' => 'jiro@example.com',
            'created_at' => now(),
            'updated_at' => now(),
        ],
    ]);
}

これで開発やテストの際に、あらかじめ準備したユーザー情報をDBに投入できます。 複数のシーダーファイルを分けて管理することも可能なので、必要に応じて整理してみると良いでしょう。

リレーションの活用

LaravelのEloquent ORMでは、テーブル同士の関連付け(リレーション)を簡単に表現できます。 一対多や多対多などのリレーションをコードレベルで定義しておくと、関連データへのアクセスがスムーズになります。

1対多のリレーション

例えば、ユーザーが複数の記事を投稿している場合、UserモデルからPostモデルへ「1対多」のリレーションを設定します。 Userモデルに以下のようなメソッドを追加します。

public function posts()
{
    return $this->hasMany(Post::class);
}

逆にPostモデルには、ユーザーを取得するためのメソッドを設定します。

public function user()
{
    return $this->belongsTo(User::class);
}

この設定によって、ユーザー情報から投稿内容を簡単に取得できるようになります。 $user->posts のようなプロパティアクセス感覚で関連データを呼び出せるのは便利ですね。

多対多のリレーション

多対多の場合は、中間テーブルを用意して belongsToMany() メソッドを使います。 例えばユーザーと「グループ」の関係が多対多になっているとしましょう。 UserモデルとGroupモデルに、それぞれ次のようなメソッドを定義します。

public function groups()
{
    return $this->belongsToMany(Group::class);
}
public function users()
{
    return $this->belongsToMany(User::class);
}

この構成であれば、 $user->groups と書くだけでユーザーが所属するグループをまとめて取得できます。

Eloquentのリレーションを活用すると、SQL文を意識せずに関連データを参照できるため、開発効率が上がりやすいでしょう。

実務で使うときの注意点

Laravelを使って実務を行う際には、いくつか気をつけたいポイントがあります。 特にデータベース設計やセキュリティ面を考慮しながらコードを書くと、後々の保守が楽になるでしょう。

N+1問題を避ける

リレーションを多用していると、画面描画時に追加のクエリが大量に発行されるケースがあります。 いわゆるN+1問題です。 Eager Loadingと呼ばれる機能を使い、with() メソッドで関連データをまとめて取得することで、クエリの回数を減らすことが可能です。

$users = User::with('posts')->get();

このように書くと、ユーザーと投稿の情報を一度に読み込めるため、無駄なクエリを回避できます。

大量データのインポートやエクスポート

バッチ処理やレポート作成で、大量データを一括操作する場面があるかもしれません。 こうした場合は、クエリビルダやトランザクションを併用してパフォーマンスと整合性を両立させましょう。 Laravelでは DB::transaction() を使って、複数のDB操作をまとめて1つのトランザクションとして管理できます。

バリデーションとDBの整合性

フォーム入力を受け取る場合は、コントローラでバリデーションを行う必要があります。 DBに直接書き込む前に、必須項目のチェックや書式の検証を徹底しておくと、テーブルの整合性が保たれます。 Eloquentでも $fillable を活用すれば、ホワイトリスト方式でカラムを指定して、意図しない値が挿入されないようにできます。

トランザクションやバリデーションを怠ると、思わぬデータ不整合やセキュリティ上の問題が発生する可能性があります。小さなアプリケーションでも慎重に扱うことが重要です。

まとめ

Laravelのデータベース機能は、初めて触る方にもわかりやすい設計が特徴です。 .envファイルで接続先を管理し、Eloquent ORMやクエリビルダを使ってデータ操作を効率化できます。 また、リレーションやマイグレーションなど、実務でも必須となる仕組みが整っているため、チーム開発でも役立つでしょう。 大規模なプロジェクトになっても、N+1問題を意識したEager Loadingやトランザクションをうまく使えば、パフォーマンスと保守性を両立できます。 初心者の皆さんがこれからLaravelを学ぶ上で、データベースの扱いをきちんと理解しておくことは大切だといえそうですね。

Laravelをマスターしよう

この記事で学んだLaravelの知識をさらに伸ばしませんか?
Udemyには、現場ですぐ使えるスキルを身につけられる実践的な講座が揃っています。