Laravelのモデルとテーブルの命名規則を理解しよう!初心者向けEloquent ORM解説
生徒
「Laravelでデータベースを操作する時にモデルを使うって聞いたんですけど、テーブルとの関係がよく分かりません。」
先生
「いい質問ですね。Laravelでは、Eloquent ORMという仕組みを使ってデータベースを簡単に操作できるんです。その時に大事なのがモデルとテーブルの命名規則です。」
生徒
「命名規則って、名前の付け方にルールがあるってことですか?」
先生
「そうです!Laravelではモデル名とテーブル名の対応に決まりがあるので、そのルールを覚えると余計な設定をせずに済むんですよ。」
1. LaravelのEloquent ORMとは?
Laravelには、データベース操作を驚くほど直感的にしてくれるEloquent ORM(エロクエント オーアールエム)という機能が備わっています。ORMは「Object-Relational Mapper」の略で、データベースの複雑な表(テーブル)を、プログラム上の「クラス(モデル)」という扱いやすい形式に変換してくれる橋渡し役です。
プログラミング未経験の方には少し難しく聞こえるかもしれませんが、イメージとしては「データベースの1行が、1つのデータが入ったファイルや箱(オブジェクト)」に変わるような感覚です。通常、データを取得するには「SQL」という専門的な命令文が必要ですが、Eloquentを使えば、PHPの慣れた書き方だけで操作が完結します。
たとえば、名簿テーブルから「IDが1番の人」を探したいとき、従来のプログラミングでは長い呪文のようなSQLを書く必要がありました。
しかし、Eloquent ORMを使うと、以下のようにたった1行でデータを取得できます。
// 「Userモデル」を使ってIDが1のユーザーを探す
$user = User::find(1);
// そのユーザーの名前を表示する
echo $user->name;
このように、Userというモデルを通してデータを操作するだけで、裏側でLaravelが自動的に「users」テーブルとやり取りをしてくれます。SQLを1文字も書かずに、あたかも目の前にあるデータを編集するような感覚で追加・更新・削除ができる。これがEloquent ORMが「魔法のようだ」と言われる最大の理由です。
2. モデルとテーブルの基本的な命名規則
Laravelでは、モデルとテーブルの名前に一定の規則があります。これを守れば、特別な設定をしなくても自動で関連付けられます。
- モデル名は単数形・先頭大文字(例:
User,Post) - テーブル名は複数形・小文字(例:
users,posts)
つまり「Userモデル ⇔ usersテーブル」、「Postモデル ⇔ postsテーブル」というように、自動的に関連付けされます。
3. サンプルで理解しよう
例えば、ブログの記事を保存する「Post」モデルを作った場合を考えてみましょう。
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
// 特別な設定をしなくても posts テーブルと自動で対応する
}
この場合、Laravelは自動的に「posts」というテーブルを探して使ってくれます。
4. 命名規則を守らない場合の指定方法
もしテーブル名が命名規則に従っていない場合、モデルで明示的に指定する必要があります。
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
// 本来は articles というテーブルを探すが、
// 明示的にテーブル名を指定できる
protected $table = 'blog_posts';
}
このように$tableプロパティを使えば、好きな名前のテーブルと関連付けることも可能です。
5. 複数形・単数形のルールと英語の注意点
Laravelでは英語の複数形ルールに従ってテーブル名が決まります。たとえば以下のような形です。
User→usersCategory→categoriesPerson→people
英語の複数形には例外もあるため、Laravelの規則をうまく使いつつ、必要に応じて$tableを指定するのが実用的です。
6. 実際の操作イメージ
最後に、モデルを使ってテーブルを操作する例を見てみましょう。例えば新しい記事を保存する場合です。
$post = new Post();
$post->title = '初めての記事';
$post->content = 'これはLaravelの学習記事です。';
$post->save();
このようにモデルを通して簡単にデータを保存できます。ここで使っている「Post」モデルが、裏側では「posts」テーブルに自動的に対応しているのです。
まとめ
ここまで、Laravelにおける「Eloquent ORM」の基本概念から、モデルとデータベーステーブルを紐付けるための「命名規則」について詳しく解説してきました。Laravelを使いこなす上で、この命名規則を理解しておくことは非常に重要です。なぜなら、フレームワーク側が提供している「設定より規約(Convention over Configuration)」という思想を最大限に活用することで、コードの記述量を劇的に減らすことができるからです。
モデルとテーブルのルールを再確認
Laravelのルールでは、PHPのクラスとして定義する「モデル名」は「単数形・先頭が大文字(パスカルケース)」で記述します。一方で、データベースに実際に作成される「テーブル名」は「複数形・すべて小文字(スネークケース)」にするのが標準です。このルールに従うだけで、Laravelは自動的に「このモデルはこのテーブルを操作するためのものだ」と認識してくれます。
| モデル名(PHPクラス) | 対応するテーブル名(DB) | 備考 |
|---|---|---|
| Product | products | 標準的な複数形 |
| Entry | entries | 「y」を「i」に変えて「es」 |
| Child | children | 不規則な複数形 |
| AdminUser | admin_users | キャメルケースはアンダースコア区切りになる |
命名規則をカスタマイズする応用テクニック
実務では、既に運用されているデータベースを操作する場合など、どうしてもこの規則に従えない場面に遭遇します。その際に役立つのが、モデルクラス内で明示的にプロパティを定義する方法です。テーブル名だけでなく、主キー(プライマリキー)の名前や、タイムスタンプ(created_at, updated_at)の有無も自由に制御できます。
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class ProductItem extends Model
{
// 1. テーブル名を個別に指定する
protected $table = 'mst_products';
// 2. 主キーが 'id' 以外の場合に指定する
protected $primaryKey = 'product_code';
// 3. 主キーがオートインクリメントではない(文字列などの)場合に指定する
public $incrementing = false;
// 4. 主キーの型が整数(int)以外の場合に指定する
protected $keyType = 'string';
// 5. created_at や updated_at を自動更新したくない場合
public $timestamps = false;
}
このように、Laravelは「基本は自動」でありながら、「必要に応じて柔軟にカスタマイズ可能」という設計になっています。初心者のうちは、まずは標準の命名規則をしっかり守り、Laravelらしい美しいコードを書くことを心がけましょう。命名規則を守ることは、自分だけでなく他の開発者がコードを見たときの読みやすさ(可読性)を向上させることにも繋がります。
データの取得・検索・保存の具体例
実際にEloquentを使って、どのようにデータを扱うのか、もう少し踏み込んだコードを見てみましょう。例えば、特定の条件でデータを検索し、存在しない場合はエラーを出すといった処理も、メソッド一つで完結します。
// IDが10のユーザーを取得する(見つからない場合は例外を投げる)
$user = User::findOrFail(10);
// 名前が「田中」のユーザーをすべて取得し、更新日の降順で並び替える
$users = User::where('name', '田中')
->orderBy('updated_at', 'desc')
->get();
// データの更新
if ($user) {
$user->email = 'new-address@example.com';
$user->save();
}
実行結果のイメージは、内部的に以下のようなSQLが発行されていることと同じ意味になります。
SELECT * FROM users WHERE id = 10;
SELECT * FROM users WHERE name = '田中' ORDER BY updated_at DESC;
UPDATE users SET email = 'new-address@example.com' WHERE id = 10;
このように、SQLの知識が浅くても直感的にデータベース操作ができるのがEloquentの最大のメリットです。しかし、裏側でどのようなSQLが動いているかを意識することは、パフォーマンスの良いアプリケーションを作る上で非常に大切です。
生徒
「先生、ありがとうございました!モデル名が単数形で、テーブル名が複数形という基本ルールは、英語の授業みたいで面白いですね。」
先生
「そうですね。英語に馴染みがないと最初は戸惑うかもしれませんが、Laravelが賢く判断してくれるおかげで、私たちが書く設定ファイルが少なくて済むんです。これを『規約』と呼びます。」
生徒
「もし、既存のシステムのデータベースを使うことになって、テーブル名が『t_member_list』みたいにルールに合っていない時は、どうすればいいんでしょうか?」
先生
「その時は、モデルの中で protected $table = 't_member_list'; と書けば大丈夫ですよ。Laravelは、開発者が明示的に指定した設定を一番優先してくれますから。」
生徒
「なるほど。自由度も高いんですね!あと、複数形のsの付け方が特殊な単語、例えば『Person』が『people』になるようなケースもLaravelは知っているんですか?」
先生
「はい、Laravelの中には『Inflector』という英単語の単数・複数変換を行うライブラリが入っているので、かなり正確に変換してくれます。ただ、あまりに特殊な造語などは間違えることもあるので、迷ったら php artisan tinker というコマンドを使って、自分で確認してみるのも上達への近道ですよ。」
生徒
「実際にコードを動かして確認するのが一番確実ですね。Eloquentを使えばSQLを直接書くよりもずっと楽に開発できそうなので、もっと練習してみます!」
先生
「その意気です!モデルをマスターすれば、Laravelでのアプリ開発はもっと楽しくなります。次はリレーション(テーブル同士の繋がり)についても学んでいきましょうね。」