Laravel で テーブル作成・操作 や ダミーデータの設定・登録 したいんだけど、どうすれば良いのかな?
今回は、Laravel で データベースのテーブル構造をコードで管理 する Migration や データベースのテーブルを操作 する Model、 開発・テスト用のダミーデータを簡単に登録 できる Seeder・Factory の実装方法について、ご紹介します。
Laravel の 環境構築がまだの場合 は、下記より Laravel の 環境構築 を行なってください。
Laravel テーブル作成(Migration)とテーブル操作(Model)、ダミーデータ投入(Seeder・Factory)の実装手順
Laravel でテーブル作成(Migration)とテーブル操作(Model)、ダミーデータ投入(Seeder・Factory)を実装する方法 は、以下の通りです。
- Migrationでテーブルの作成
→ データベースのテーブル構造(カラムや型など)をコードで定義し、テーブルを作成します - Modelの作成
→ 作成したテーブルをLaravelのアプリケーションから操作するためのモデルを作成します - Factoryでダミーデータの定義
→ Faker を利用して、テストや開発用のダミーデータの内容を定義します - Seederでデータの登録
→ Factory で定義したダミーデータを使って、データベースにダミーデータを登録します
Migration でテーブルの作成
今回は例として、投稿テーブル(posts)に ユーザー(user_id)とのリレーション(紐付け) を持たせるように作成します
マイグレーション(Migration)ファイルの作成
最初に、下記の コマンドを実行 して、テーブル(例:posts)を作成するためのマイグレーションファイルを作成 します
# マイグレーション作成コマンド
php artisan make:migration create_posts_table
# 上記のコマンドを実行すると、下記のファイルが作成される
database/migrations/20XX_XX_XX_000000_create_posts_table.php
マイグレーション(Migration)ファイルにテーブルカラム・構造を定義
Migration は、データベースのテーブル構造をコードで管理するための仕組み で、作成されたマイグレーションファイルを編集して、テーブルのカラムや構造を定義 していきます
// database/migrations/20XX_XX_XX_000000_create_posts_table.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(); // 主キー
// usersテーブルとのリレーション
$table->foreignId('user_id')->constrained()->cascadeOnDelete();
$table->string('title'); // タイトル
$table->text('content'); // 本文
$table->timestamps(); // created_at / updated_at
});
}
public function down(): void
{
Schema::dropIfExists('posts');
}
};
補足①: usersテーブル(user_id)とのリレーション
// usersテーブルとのリレーション
$table->foreignId('user_id')->constrained();
// 処理のイメージ
posts テーブルに user_id カラムを作成
↓
posts.user_id が users.id を参照する外部キーとして設定
この記述は、posts テーブルの user_id カラム(posts.user_id)を作成 し、users テーブルの id カラム(users.id)を外部キーとして参照する という意味になります。
これにより、どのユーザーが投稿した記事なのかをデータベース上で紐づけることができます。
補足②: cascadeOnDelete()
// 外部キーで関連付けられているデータを自動で削除する設定
->cascadeOnDelete()
cascadeOnDelete() は、外部キーで関連付けられているデータを自動で削除する設定 です
これにより、ユーザーが削除された際に、そのユーザーに紐づく投稿データも自動で削除されます。
※ 外部キー制約を設定しておく ことで、データの整合性を保つ ことができます。
// usersテーブルとのリレーション
$table->foreignId('user_id')->constrained()->cascadeOnDelete();
// 処理のイメージ
ユーザー削除(usersテーブル)
↓
そのユーザーの投稿も削除(postsテーブル)
Migration の実行(テーブル作成)
作成したマイグレーションを実行する ことで、データベースにテーブルが作成されます。
下記の コマンドを実行 すると、DB に postsテーブル が作成されます。
※ Migrationを実行する と、Laravel では database/migrations にある未実行のマイグレーションを順番に実行します
php artisan migrate
テーブル構造
| カラム名 | 型 | 説明 |
|---|---|---|
| id | bigint | 投稿ID(主キー) |
| user_id | bigint | usersテーブルのidを参照する外部キー |
| title | varchar | 投稿タイトル |
| content | text | 投稿本文 |
| created_at | timestamp | 作成日時 |
| updated_at | timestamp | 更新日時 |
Model の作成
Laravel では、データベースのテーブルを操作する ために Model を作成します。
今回は例として、posts テーブルを操作するための Postモデル を作成します。
Model ファイルの作成
下記の コマンドを実行 して、 テーブル(例:posts)を操作するモデルファイル(Post)を作成します。
php artisan make:model Post
実行すると、「app/Models/Post.php」のファイルが作成されます
Post モデルの編集
作成された Post.php を編集して、操作可能なカラムやリレーションを設定 します
// app/Models/Post.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Post extends Model
{
use HasFactory; // ダミーデータ生成の設定
// 保存・更新可能なカラム
protected $fillable = [
'user_id',
'title',
'content',
];
/**
* 投稿に紐づくユーザー(user)を取得するリレーション
*/
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
}
各設定の説明
- $fillable
- user_id, title, content など、配列に指定したカラムだけが保存・更新できる ようになるため、モデルを通して create や update を使ってまとめて値を設定・更新できます。
- HasFactory
- Factory(ダミーデータ生成)を使うために必要な設定です。
- belongsTo
- User モデル と Post モデル を 紐づける場合にリレーションを定義 することで、
$post->user で 投稿のユーザー情報を取得する ことができます。 - users テーブルと posts.user_id のリレーション を モデル側でも表現する ことができます。
- User モデル と Post モデル を 紐づける場合にリレーションを定義 することで、
User モデルの編集(リレーションの追加)
users テーブルに対応する User モデル は、Laravelのプロジェクト作成時に最初から用意されているため、新しく作成する必要はありません。
ただし、ユーザーに紐づく投稿データを取得できるようにする ため、posts テーブルの posts.user_id と users.id を紐づけるリレーション を User モデルに追加します。
- hasMany
User モデル と Post モデル を 紐づける場合にリレーションを定義する ことで、
$user->posts で ユーザーに紐づく投稿データを取得することができます。
users テーブル の users.id と posts.user_id のリレーション を モデル側でも表現する ことができます。
// app/Models/User.php
namespace App\Models;
use Illuminate\Database\Eloquent\Relations\HasMany;
class Post extends Model
{
/**
* ユーザーに紐づく投稿(posts)を取得するリレーション
*/
public function posts(): HasMany
{
return $this->hasMany(Post::class);
}
}
※ User モデル 側では hasMany(1対多)、Post モデル 側では belongsTo(多対1)の リレーションを定義 します。
Factory でダミーデータの定義
Laravel では、開発やテスト用にダミーデータを簡単に作成する ために Factory を使用します。
今回は例として、posts テーブル用の PostFactory を作成します。
Factory の作成コマンド
下記の コマンドを実行 して、PostFactory を作成します
php artisan make:factory PostFactory --model=Post
実行すると、「database/factories/PostFactory.php」の ファイルが作成 されます
PostFactory の編集
作成された PostFactory を編集して、ダミーデータの内容を定義します。
※ PostFactory を実行する と、「user_id => User::factory() 」により、作成される投稿は自動的に posts.user_id に紐付け られます
// database/factories/PostFactory.php
namespace Database\Factories;
use App\Models\Post;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
class PostFactory extends Factory
{
public function definition()
{
return [
'user_id' => User::factory(), // ユーザーを自動作成して紐づけ
'title' => $this->faker->sentence, // ランダムな文章をタイトルに設定
'content' => $this->faker->paragraph, // ランダムな段落を本文に設定
];
}
}
補足: users テーブルの UserFactory
※ users テーブル users.id を posts テーブル posts.user_id に紐づけるため UserFactory を使用していますが、Laravelではプロジェクト作成時に UserFactory は最初から用意されている ため、新しく作成する必要はありません
Seeder でデータの登録
Laravel では、Factory で定義したダミーデータをデータベースに登録する ために Seeder を使用します。
今回は例として、posts テーブルにダミーデータを登録する方法 を紹介します。
Seeder の作成コマンド
下記の コマンドを実行 して、PostSeeder を作成します
php artisan make:seeder PostSeeder
実行すると、「database/seeders/PostSeeder.php」の ファイルが作成 されます
PostSeeder の編集
作成された PostSeeder.php を編集して、PostFactory を使って ダミーデータを登録 します
※ 例として、users テーブルに100件、posts テーブルに、1000件 の ダミーデータ を登録
{{-- database/seeders/PostSeeder.php --}}
namespace Database\Seeders;
use App\Models\User;
use App\Models\Post;
use Illuminate\Database\Seeder;
class PostSeeder extends Seeder
{
public function run(): void
{
$userCount = 100; // 作成するユーザー数
$targetPosts = 1000; // 作成する投稿の総数
$minPostCount = 7; // 各ユーザーの最低投稿数
// ① ユーザー作成 + 各ユーザーに最低投稿数の投稿を作成
// Userモデルの posts() リレーションを使うことで user_id は自動で設定される
$users = User::factory()
->count($userCount)
->has(Post::factory()->count($minPostCount))
->create();
// ② 残り投稿数を計算
$remainingPosts = $targetPosts - ($userCount * $minPostCount);
// ③ 残り投稿をランダムにユーザーへ割り当て
while ($remainingPosts > 0) {
// ランダムに1〜5件の投稿数を作成
// 残り投稿数を超えないように min() で調整
$count = min(rand(1, 5), $remainingPosts);
// ランダムなユーザーに投稿を作成
Post::factory()->count($count)->create([
'user_id' => $users->random()->id
]);
// 作成した投稿数を残り投稿数から減算
$remainingPosts -= $count;
}
}
}
Seeder の実行
作成した Seeder を実行 して、データベースにダミーデータを登録 します。
php artisan db:seed --class=PostSeeder
users テーブル
実行後の users テーブルに 100件のダミーデータ が挿入されている

posts テーブル
実行後の posts テーブルに、1000件のダミーデータ が挿入されている

処理の実行イメージ
ユーザー人数を100人作成
↓
各ユーザーに7件の投稿を作成
↓
残り投稿数を計算(1000 - 700 = 300件)
↓
残りの投稿数300件をランダムで1〜5件ずつユーザーに割り当て
↓
最終的に投稿数が1000件が作成される
まとめ
今回は、Laravel で テーブル作成(Migration)と テーブル操作(Model)、ダミーデータ投入(Seeder・Factory) を行う方法について紹介しましたが、いかがでしたでしょうか?
Laravel では、データベースのテーブル構造(カラムや型など)を定義してテーブルを作成 する Migration や、作成したテーブルを Laravel アプリケーションから操作する ための Model を作成 します。
また、Fakerを利用してテストや開発用のダミーデータを生成する内容を定義する Factory や、その Factory を利用してデータベースにダミーデータを登録する Seeder を使用する ことができます。
Seeder や Factory を活用する ことで、開発環境やテスト環境でも簡単にダミーデータを作成できる ようになります。
まずは基本的な使い方をしっかり押さえ、Laravel の知識や理解をより深めていきましょう。



コメント