技術資料

Laravel 13でSQLiteを使ったCRUD入門:MigrationとEloquent Modelでmembersテーブルを操作する

作成日:2026.08.14

Laravel 13でSQLiteを設定し、Migrationでmembersテーブルを作成します。Eloquent ModelとLaravel Tinkerを使い、名前とメールアドレスの登録・取得・更新・削除を試します。

前回は、Windows 11にLaravel 13の開発環境を用意し、ルーティング、Controller、Bladeを使って最小限の画面を表示しました。

今回はその続きとして、LaravelからSQLiteへ接続し、Migrationでテーブルを作成してみます。作成したテーブルに対して、Eloquent Modelを使ったデータの登録、取得、更新、削除というCRUDも確認します。

画面や認証機能は扱わず、Laravel Tinkerから処理を実行します。ブラウザ用のフォームを作成しなくても、Laravelのデータベース処理を確認できる構成です。

前提

今回の対象環境は以下の通りです。

  • OS: Windows 11
  • PHP: 8.3以上
  • Composer
  • Laravel Framework: 13.x
  • SQLite
  • PHPのSQLite拡張
  • ターミナル: PowerShell

Laravel 13.xの新規プロジェクトを作成する手順は、前回の記事「Windows 11でLaravel 13を始める:環境構築からルーティング・Controller・Bladeまで」で説明しています。Laravelのプロジェクトを作成済みで、プロジェクトのルートディレクトリをPowerShellで開いている状態から始めます。

今回作成するのは、認証機能で使うユーザー情報ではありません。membersという説明用テーブルに、名前とメールアドレスを保存します。実際のサービスでユーザー情報を扱う場合は、認証、認可、個人情報の管理などを別途設計してください。

Laravelとデータベース処理

Laravelでは、データベースへ接続する方法として、SQLを直接実行する方法のほかに、Query BuilderやEloquent ORMを利用できます。

Eloquentでは、データベースのテーブルに対応するModelを作成します。Modelを通してデータを取得したり、レコードを追加・変更・削除したりできます。今回は、Member Modelでmembersテーブルを操作します。

テーブルの構造はMigrationで管理します。Migrationは、テーブルの作成や変更をPHPコードとして記録し、複数の環境で同じ変更を適用するための仕組みです。

SQLiteの接続設定
  ↓
Migrationでmembersテーブルを作成
  ↓
Member Modelを作成
  ↓
TinkerからCRUDを実行

SQLiteの設定を確認する

SQLiteは、データベースを一つのファイルとして扱えるデータベースです。MySQLやMariaDBのように、別のデータベースサーバーを起動しなくても利用できます。Laravelの入門用に、データベース処理を試す環境として扱いやすいと思います。

Laravelプロジェクトの.envを開き、データベースに関する設定を確認します。

DB_CONNECTION=sqlite
DB_DATABASE=database/database.sqlite

プロジェクトによっては、DB_DATABASEにSQLiteファイルの絶対パスが記述されています。実際に読み込まれる設定は、プロジェクトのconfig/database.phpで確認できます。

database/database.sqliteが存在しない場合は、プロジェクトのルートディレクトリで次のコマンドを実行して空のファイルを作成します。

New-Item -ItemType File database\database.sqlite

すでにファイルが存在する場合は、このコマンドを実行する必要はありません。既存のSQLiteファイルを誤って上書きしないように、実行前にファイルの有無を確認してください。

PHPでSQLiteを利用するには、SQLite用のPDO拡張が必要です。次のコマンドで有効になっている拡張を確認できます。

php -m | Select-String -Pattern 'PDO|sqlite'

pdo_sqlitesqlite3が表示されれば、今回の処理に必要な拡張が有効になっています。表示されない場合は、PHPのphp.iniで拡張を有効にしたうえで、使用しているPHPとPowerShellのPATHが一致しているか確認します。

Laravel Tinkerとは

Laravel Tinkerは、Laravelアプリケーションの中でPHPコードを対話的に実行するための機能です。ターミナルへコードを入力すると、その場で実行結果を確認できます。このような対話型の実行環境は、REPL(Read-Eval-Print Loop)と呼ばれます。

Tinkerでは、Laravelの設定値を確認したり、Eloquent Modelを使ってデータベースを操作したりできます。今回はブラウザの画面やフォームを作成せず、TinkerからMember Modelを操作してCRUDを確認します。

Laravel 13.xでは、プロジェクトのルートディレクトリで次のコマンドを実行するとTinkerを起動できます。TinkerはLaravelアプリケーションに含まれており、通常は追加インストールなしで利用できます。詳しくはLaravel公式ドキュメントのTinker(REPL)の説明を参照してください。

php artisan tinker

起動後は、PHPコードを入力してEnterキーを押すと実行できます。例えば、次のコードでLaravelのデフォルトデータベース接続を確認できます。

config('database.default');
config('database.connections.sqlite.database');

デフォルト接続がsqliteで、データベースファイルのパスが意図したものになっていることを確認します。Tinkerを終了するときは、exitを入力します。以降のCRUDの例では、必要に応じて同じようにphp artisan tinkerを起動してコードを実行してください。

Migrationでmembersテーブルを作成する

まず、Member ModelとMigrationを作成します。

php artisan make:model Member -m

-mは、Modelと同時にMigrationを作成するオプションです。通常は次の2つのファイルが作成されます。

app/Models/Member.php
database/migrations/2026_08_14_000000_create_members_table.php

Migrationのファイル名に含まれる日時部分は、実際に作成した時刻に置き換わります。記事中のファイル名は説明用なので、作成されたファイル名に読み替えてください。

作成されたMigrationを開き、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('members', function (Blueprint $table): void {
            $table->id();
            $table->string('name');
            $table->string('email');
            $table->timestamps();
        });
    }

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

今回のテーブルには、idnameemailcreated_atupdated_atを用意しています。downメソッドには、Migrationを戻すときにmembersテーブルを削除する処理を記述しています。

Migrationの実行状況を確認します。

php artisan migrate:status

確認ができたら、未実行のMigrationを適用します。

php artisan migrate

実行後にmigrate:statusをもう一度実行し、作成したmembers用のMigrationが実行済みになっていることを確認します。

Migrationを戻す場合は、次のコマンドを実行します。

php artisan migrate:rollback

migrate:rollbackは、直前のバッチに含まれるMigrationを戻します。SQLiteファイル内のデータも削除されるため、既存データがある環境では実行前に対象を確認してください。

Member Modelを確認する

make:modelで作成されたapp/Models/Member.phpを開きます。Model名からテーブル名を推測できる場合、Eloquentの規約によりMembermembersテーブルへ対応します。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Member extends Model
{
    //
}

今回はTinkerで属性を一つずつ指定して保存するため、Modelへ特別な設定を追加しなくても処理できます。createupdateへ配列を渡す場合は、マスアサインメントの対象を明示する必要があります。

CRUDを実行する

ここからは、Laravel TinkerでMember Modelを操作します。

php artisan tinker
Create: データを登録する

まず、Memberのインスタンスを作成し、nameemailを指定して保存します。

use App\Models\Member;

$member = new Member();
$member->name = '野毛朋子';
$member->email = 'moko@example.test';
$member->save();

saveが成功すると、idcreated_atupdated_atなどが設定されたMemberのインスタンスが保存されます。example.testは説明用のドメインなので、実在するメールアドレスへ送信されるわけではありません。

同じように、もう1件登録します。

$member = new Member();
$member->name = '多祢村理子';
$member->email = 'wind@example.test';
$member->save();
Read: データを取得する

登録したデータを一覧で取得します。

$members = Member::orderBy('id')->get();

$members->each(function (Member $member): void {
    echo $member->id . ': ' . $member->name . ' / ' . $member->email . PHP_EOL;
});

getは条件に一致するレコードをCollectionとして取得します。ここではidの昇順に並べています。

主キーを指定して1件取得する場合は、findを使います。

$member = Member::find(1);
$member->name;

該当するレコードがない場合、findnullを返します。必ず存在する前提で例外にしたい場合は、findOrFailを使います。

$member = Member::findOrFail(1);
Update: データを更新する

取得したModelの属性を変更し、saveを実行すると、対象レコードを更新できます。

$member = Member::findOrFail(1);
$member->email = 'moko.updated@example.test';
$member->save();

更新結果を確認します。

Member::find(1)->email;
Delete: データを削除する

最後に、Modelのdeleteメソッドでレコードを削除します。

$member = Member::findOrFail(2);
$member->delete();

削除後に一覧を取得すると、IDが2のレコードが表示されなくなります。

Member::orderBy('id')->get(['id', 'name', 'email']);

今回は確認事項に合わせて物理削除を使いました。実際のサービスで削除履歴を残したい場合は、Soft Deletesなど別の設計を検討します。

Tinkerを終了するときは、exitを入力します。

配列を使って登録・更新する場合

ここまでの例では、Modelの属性を一つずつ指定しました。Eloquentには、配列を使って登録・更新する方法もあります。

Laravel 13.xでは、createfillへ配列を渡す場合、Model側でマスアサインメントを許可する属性を指定します。例えば、Fillable属性を使うと、登録可能なカラムを限定できます。

<?php

namespace App\Models;

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

#[Fillable(['name', 'email'])]
class Member extends Model
{
    //
}

この設定を追加した場合は、次のように配列から登録できます。

Member::create([
    'name' => '新井素羽',
    'email' => 'closer@example.test',
]);

配列の中身をリクエストからそのまま渡すのではなく、保存してよい項目だけを渡すようにします。マスアサインメントの設定を誤ると、意図していない入力値まで保存される可能性があります。

入力値を検証する場合

今回はTinkerから固定値を登録しているため、HTTPリクエストのバリデーションは実装していません。フォームやAPIから値を受け取る場合は、Controllerなどで入力値を検証してからModelへ渡します。

$validated = $request->validate([
    'name' => ['required', 'string', 'max:255'],
    'email' => ['required', 'email', 'max:255'],
]);

Member::create($validated);

この例を使う場合は、Member Modelへ#[Fillable(['name', 'email'])]を設定します。メールアドレスの形式を検証しても、実在性やメールの到達性まで確認できるわけではありません。

うまく動かない場合

could not find driverになる

SQLiteへ接続したときにcould not find driverと表示される場合は、PHPのSQLite用PDO拡張が有効になっていない可能性があります。

Get-Command php
php --ini
php -m | Select-String -Pattern 'PDO|sqlite'

複数のPHPをインストールしている場合、ブラウザで使っているPHPと、PowerShellで使っているPHPが異なることもあります。php --iniで表示された設定ファイルが、想定したPHPのものか確認します。

Migrationが実行されない

Migrationが実行済みの場合、migrateを実行しても同じMigrationは再実行されません。php artisan migrate:statusで状態を確認し、Migrationのファイル名やテーブル名に誤りがないかを確認します。

開発中のデータを削除して最初から作り直す場合は、migrate:freshを使う方法もあります。ただし、接続中のデータベースにあるすべてのテーブルを削除してからMigrationを実行するコマンドです。共有データベースや必要なデータが入った環境では実行しないでください。

php artisan migrate:fresh
.envの変更が反映されない

.envの接続設定を変更したのに別のデータベースへ接続している場合は、設定キャッシュが残っている可能性があります。

php artisan config:clear

その後、Tinkerからconfig('database.default')config('database.connections.sqlite.database')を確認します。

注意点

  • 今回のmembersテーブルはCRUDを説明するためのサンプルで、Laravelの認証用ユーザー管理ではない。
  • 実際のユーザー情報を扱う場合は、認証、認可、個人情報保護、メールアドレスの重複制約などを設計する。
  • .envに秘密情報を記述する場合は、Gitの管理対象へ含めない。
  • migrate:rollbackmigrate:freshはデータを削除する可能性があるため、対象のデータベースを確認してから実行する。
  • この記事のCRUD例はTinkerから固定値を操作する簡易例であり、公開サービスでそのまま使えるユーザー管理機能ではない。

まとめ

今回は、Laravel 13でSQLiteを使い、Migrationでmembersテーブルを作成しました。テーブルには、名前とメールアドレスの二つの項目を用意しています。

その後、Member Modelを使って、データの登録、取得、更新、削除をTinkerから実行しました。画面を作成しなくても、Eloquent Modelを使ったデータベース処理の基本を確認できます。

Laravelでデータベースを扱うときは、Migrationでテーブル構造を管理し、Modelでデータを操作します。画面やAPIを追加する場合も、入力値を検証してからModelへ渡すという流れを意識すると、処理を分けて考えやすくなるかと思います。

この記事を書いた人

※上が私です。

奈良市を拠点に、27年以上の経験を持つフリーランスWebエンジニア、阿部辰也です。

これまで、ECサイトのバックエンド開発や業務効率化システム、公共施設の予約システムなど、多彩なプロジェクトを手がけ、企業様や制作会社様のパートナーとして信頼を築いてまいりました。

【制作会社・企業様向けサポート】
  • 専任エンジニアのいない企業様に対するシステム面の不安を解消
  • 柔軟な契約形態や短納期での対応により、急なニーズにも迅速にサポート
  • システムの企画段階から運用まで、ワンストップでのサービスを提供

Webシステムの開発やサイト改善でお困りの際は、どうぞお気軽にご相談ください。小さな疑問から大規模プロジェクトまで、最適なご提案を心を込めてさせていただきます。

ぜひ、プロフィールWeb制作会社様向け業務案内一般企業様向け業務案内もご覧くださいね。

Windows 11でLaravel 13を始める:環境構築からルーティング・Controller・Bladeまで

2026.08.13

Windows 11にPHP、Composer、Laravel Installerを用意し、Laravel 13のプロジェクトを作成します。routes/web.php、Controller、Bladeの役割を説明し、最小構成のWebページを表示するまでの流れと、Windows環境でつまずきやすい点を紹介します。

Laravel PHP

Windows 11にMailpitを導入してLaravelのメール送信を確認する

2026.08.06

Windows 11にMailpitを導入し、Laravel 13からSMTPでテストメールを送信して、MailpitのWeb UIで受信内容を確認する手順を紹介します。設定キャッシュ、ポート競合、キュー送信、メールFakeとの使い分けについても説明します。

Laravel Mailpit PHP

MarkdownをHTMLへ変換する方法とXSS対策:PHP・JavaScript・Vue.jsの実装例

2026.08.12

PHP のleague/commonmarkと、Node.js のMarked・DOMPurifyを使い、MarkdownをHTMLへ変換する方法を紹介します。ユーザー入力やAI生成Markdownを未信頼入力として扱い、Vue.js のv-htmlへ安全に表示するための設定と注意点も整理します。

JavaScript PHP Vue.js

PHPでTOTP方式のMFAを実装する|Imagick不要のSVG QRコード生成

2026.08.08

PHP 8.3.15の環境で、認証アプリを使ったTOTP方式のMFAを実装します。spomky-labs/otphpでワンタイムコードを検証し、bacon/bacon-qr-codeでImagickを使わずにSVG形式のQRコードを生成します。MFAやTOTPの基本概念から、登録処理、簡略化したログイン処理、本番環境での注意点まで紹介します。

MFA PHP TOTP

阿部辰也へのお仕事の依頼・お問い合わせ

軽いご相談もお気軽にどうぞ!

個人情報の取り扱いについて *必須 プライバシーポリシーをご確認いただき、同意いただける場合は「同意する」にチェックをしてください。

keyboard_double_arrow_up
TOP