【PHP】Laravelでデータベースと連携する方法

対象バージョン: Laravel 13.x / PHP 8.3+

Laravel では、生の SQL やクエリビルダーのほかに、Eloquent ORM を使ってデータベースを操作できます。Eloquent では、データベースの各テーブルに対応する「モデル」クラスを用意し、そのモデルを通してレコードの作成・取得・更新・削除を行います。

この記事では、posts テーブルを例に、接続設定からマイグレーションによるテーブル作成、一括代入(Mass Assignment)の設定、基本的な CRUD 操作までを順に説明します。手順どおりに進めれば、新規の Laravel 13 プロジェクトでそのまま動かせます。

この記事の前提

  • Laravel 13.x のプロジェクトを作成済みであること(Laravel 13 は PHP 8.3 以上が必要です)
  • ターミナルで php artisan コマンドを実行できること

プロジェクトの作成手順は、Laravel入門:インストールから簡単なサンプルアプリケーションの作成にまとめています。

コマンドはすべてプロジェクトのルートディレクトリで実行します。

データベースの設定

接続先の設定は .env ファイルの DB_* 変数で行います。config/database.php はこれらの環境変数を読み込んで接続を組み立てるため、通常は .env を書き換えるだけで済みます。

新しく作成した Laravel 13 プロジェクトでは、.env が SQLite を使う設定になっています。

DB_CONNECTION=sqlite

SQLite はデータベース全体を1つのファイル(既定では database/database.sqlite)に保存します。サーバーを用意せずに試せるので、学習や動作確認にはこのままで十分です。

MySQL を使う場合は、.env の DB_* 変数を次のように書き換えます。値は自分の環境に合わせてください。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=your_database
DB_USERNAME=your_username
DB_PASSWORD=your_password

Laravel 13 が公式にサポートしているデータベースは、MariaDB・MySQL・PostgreSQL・SQLite・SQL Server の5種類です。

モデルの作成

モデルとマイグレーションを同時に作る

Eloquent のモデルは make:model コマンドで作成します。-m(--migration)オプションを付けると、テーブルを作るためのマイグレーションファイルも同時に生成されます。

php artisan make:model Post -m

このコマンドで、次の2つのファイルが作られます。

  • app/Models/Post.php(モデル。名前空間は App\Models)
  • database/migrations/xxxx_xx_xx_xxxxxx_create_posts_table.php(マイグレーション。ファイル名の先頭には作成日時が入ります)

Eloquent は、クラス名を複数形のスネークケースにした名前をテーブル名とみなします。Post モデルなら、対応するテーブルは posts です。

マイグレーションでテーブルを定義する

モデルを作っただけでは、データベースにテーブルはまだありません。テーブルの構造は、マイグレーションファイルに記述します。生成されたファイルの up メソッドに、必要なカラムを追加します。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up(): void
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->text('body');
            $table->timestamps();
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('posts');
    }
};

id() は自動採番の主キー id を、timestamps() は created_at と updated_at の2カラムを作ります。今回追加したのは、タイトル用の title(文字列)と本文用の body(テキスト)です。down メソッドには、マイグレーションを取り消すときの処理を書きます。

マイグレーションを実行する

次のコマンドで、まだ実行していないマイグレーションをまとめて実行します。

php artisan migrate

これで posts テーブルが作成されます。実行状況は php artisan migrate:status で確認できます。直近に実行したマイグレーション(最後のバッチ)を取り消したいときは、php artisan migrate:rollback を使います。

一括代入できるカラムを指定する

後述の create や update は、配列でまとめて値を渡す「一括代入(Mass Assignment)」の操作です。Eloquent のモデルは、意図しないカラムを書き換えられないよう、既定で一括代入から保護されています。そのため、create を使う前に、一括代入を許可するカラムをモデルに指定しておく必要があります。

Laravel 13 の公式ドキュメントでは、Fillable 属性を使う書き方が紹介されています。属性は PHP 8 で導入された構文で、クラスの直前に #[...] の形で付けます。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Attributes\Fillable;
use Illuminate\Database\Eloquent\Model;

#[Fillable(['title', 'body'])]
class Post extends Model
{
    //
}

従来どおり $fillable プロパティで指定する書き方も使えます。どちらか一方を書けば十分です。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected $fillable = ['title', 'body'];
}

指定を忘れたまま create を呼ぶと、Add [title] to fillable property to allow mass assignment on [App\Models\Post]. という MassAssignmentException が発生します。

CRUD操作

ここからは、posts テーブルに対する作成(Create)・読み取り(Read)・更新(Update)・削除(Delete)の操作を見ていきます。コードは、php artisan tinker で起動する対話環境(Tinker)に入力して試せます。Tinker は Laravel のプロジェクトに標準で含まれています。コントローラーなどのクラスで使う場合は、ファイルの先頭に use App\Models\Post; を書いてください。

作成(Create)

create メソッドに、カラム名と値の配列を渡します。レコードが保存され、作成されたモデルのインスタンスが返ります。

use App\Models\Post;

$post = Post::create([
    'title' => 'My first post',
    'body' => 'This is my first post.',
]);

created_at と updated_at には、保存した日時が自動で入ります。

読み取り(Read)

主キーで1件を取得するには find を使います。該当するレコードがなければ null が返ります。

$post = Post::find(1);

条件を指定して取得するには、where で条件を組み立ててから get を呼びます。結果は、モデルを要素に持つコレクション(Illuminate\Database\Eloquent\Collection)として返ります。

$posts = Post::where('title', 'My first post')->get();

見つからないときに例外を発生させたい場合は、findOrFail を使います。

$post = Post::findOrFail(1);

更新(Update)

取得したモデルの update メソッドに、変更するカラムと値を配列で渡します。update も一括代入なので、ここで渡すカラムも Fillable 属性(または $fillable)に含めておく必要があります。

$post = Post::find(1);

$post->update(['title' => 'Updated title']);

プロパティに値を代入してから save を呼ぶ方法でも更新できます。この方法は一括代入ではないため、Fillable の指定に関係なく使えます。

$post = Post::find(1);

$post->title = 'Updated title';
$post->save();

どちらの方法でも、updated_at は自動で更新されます。

削除(Delete)

取得したモデルの delete メソッドを呼ぶと、そのレコードが削除されます。

$post = Post::find(1);

$post->delete();

主キーが分かっている場合は、モデルを取得せずに destroy で削除することもできます。

Post::destroy(1);

まとめ

  • 接続先は .env の DB_* 変数で設定する。新規の Laravel 13 プロジェクトは SQLite が既定
  • php artisan make:model Post -m でモデルとマイグレーションを作り、php artisan migrate でテーブルを作成する
  • create や update を使う前に、Fillable 属性または $fillable で一括代入を許可するカラムを指定する
  • CRUD は create・find / where()->get()・update・delete で行う

参考リンク

コメントする