現在Laravelの教材を鋭意制作中です!完成まで今しばらくお待ちください

#16 モデルの作成と解説

前章では、フォームで受け取るデータを保存するためのテーブルをマイグレーションによって定義し、データベースに反映しました。

そしてここからは、そのテーブルに対してデータを保存・取得する操作を担う「モデル」の作成に入ります。

Laravelにおけるモデルは、MVCアーキテクチャの「M(Model)」に該当し、1つのテーブルと対応してデータ操作の中心を担う存在です。

ユーザーから送信された入力情報を、保存・取得・更新・削除といった処理に結びつける役割を持っています。

この章では、「Contactモデル」を新規作成し、データベースとの接続や保存対象の項目を定義しながら、今後のControllerやビューとの連携に備える準備を行います。

「テーブルを作ったら、次はそのテーブルを使うための窓口を作る」

そんなイメージを持ちながら、Laravelのモデルという仕組みを学んでいきましょう。

モデルとは何か?

Laravelのモデル(Model)は、MVC(Model–View–Controller)構造の中で「データを扱う役割」を担う重要な存在です。

モデルの役割とは?

観点 内容
データ操作の窓口 データベースのテーブルとやり取りするための“窓口”
コードから管理 SQLを直接書かずに、コードでレコードを取得・保存・更新・削除が可能
構造の反映 テーブル構造(カラム名や保存項目)と1対1で対応したクラスとして機能
ビジネスロジック 必要に応じてモデルに振る舞い(メソッド)を持たせることで処理を再利用できる

Laravelのモデルとテーブルの紐づけ

Laravelでは、モデルクラスとデータベースのテーブルを命名規則に従って自動的に紐づけます。

今回の場合であれば、モデル名:Contactで、対応するテーブル名:contacts(モデル名の複数形)となります。

明示的にテーブル名を指定したい場合は $table プロパティを使用できます

protected $table = 'contacts';

1. pullとブランチの作成

まずは、作業に入る前に前回mergeしたメインブランチを更新しておきましょう。mergeはとても簡単です。

# 現在のブランチを確認する
git branch

# 現在のブランチがmainブランチではない場合
git switch main

# ブランチをpullする
git pull origin main

以上で完了です。mainブランチが前章で作成されたブランチと同じになれば、次に進みます。

ブランチは以下のように作成するのでしたね。

git switch -C make-model

今回はモデルを作成するので、make-modelと言う名前のブランチを作成しました。ブランチ名は任意となりますので、お好きなブランチ名を付けて構いません。

2.モデルファイルの作成

それでは実際にモデルを作成してみましょう。以下のコマンドを入力してください。

php artisan make:model Contact

※ モデル名は必ず大文字から始めるようにしてください!

これにより、 app/Models/Contact.php というファイルが自動生成されます。

Laravelではモデル名(Contact)とテーブル名(contacts)が命名規則により自動的に紐づきます。

モデルが生成された当初は以下のようなファイル構成になっていると思います。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;


class Contact extends Model
{
    use HasFactory;
}

use HasFactory; は、Laravelのモデルで「ファクトリー機能を使えるようにする記述」です。

簡単にいうと、テストやダミーデータの生成に役立つものです。今回のアプリでは使用しませんが、次のアプリでは使用します。

ただし、この状態ではカラム(=保存対象の項目)に関する情報は何も定義されていません。

フォームから送られたデータを正しく保存するためには、「このモデルに対してどの項目を保存してよいか?」という指定が必要です。

モデルの安全性管理

Laravelでは、フォームから送られたデータをモデルに保存する際に「どの項目なら安全に登録していいか」を指定します。

そのために使うのが、モデルの安全性管理を担う $fillable プロパティです。

フォームから受け取る項目(name, email, ageなど)を $fillable に記述することで、安全に Contact::create() のような保存処理が可能になります。

protected $fillable = [
    'name',
    'email',
    'age',
    'gender',
    'interests',
    'message',
];

これにより、上記の項目だけが保存対象として許可され、それ以外のカラムには保存されません。

fillableを設定しない場合

Laravelでは、フォームから送られてくるデータはユーザーによって自由に操作される可能性があるため、そのまま保存処理に使ってしまうと意図しないカラムに値が代入される危険性があります。

こうした不正な書き込みや予期せぬ保存操作を防ぐために、モデルには $fillable プロパティを使って「保存しても良い項目」を明示的に定義することが推奨されています。

この仕組みは、保存可能なカラムをホワイトリスト形式で限定することでアプリケーションの安全性を高めるものです。

Laravelが提供するこの $fillable は、「Mass Assignment(大量代入)」と呼ばれる脆弱性に対する標準的な防御策として機能します。

つまり、データ保存時には「この項目は安全」「これは保存してはいけない」と明確にルールを設けることで、外部からの意図しない入力をブロックし、信頼性の高いデータ操作を実現するのです。

このため、$fillableを設定しないとデータベースへのデータの導入はできないようになっています。

3.Git push

以上が完了したら、ここでGitを共有しておきましょう。

git add -A
git commit -m "コメントを入力する"
git push origin make-model

git pushが無事完了したら、GitHub上で操作を行います。

pull requestが来ているので、mergeしましょう。

次章:#17 ルーティングファイル(web.php)の仕組みと書き方 に進む