初心者でもわかるLaravel Modelの基本と活用方法
はじめに
Laravelを使ってWebアプリケーションを開発する上で、Model は重要な役割を担います。 データベースとやりとりする際に、テーブルの操作をわかりやすく整理してくれるのがModelです。 でも、初めてLaravelに触れる皆さんにとっては、少し難しく感じることもあるかもしれませんね。 そこでこの記事では、Modelの基本的な使い方や実務で活躍する具体例などを紹介していきます。 どうやってデータを保存し、取得し、更新や削除をするのかを学びながら、一歩ずつ理解を深めていきましょう。
この記事を読むとわかること
Modelがどのようにデータベースと連携しているのかを理解できるようになります。 また、実務でよく使われるリレーションの考え方や、Eager Loadingなどの少し応用的な使い方にも触れます。 それによって、開発中にテーブル同士をスムーズにつなぎ、必要な情報を効率よく扱う方法がわかるでしょう。
Laravel Modelとは何か
Modelとは、データベースのテーブルをオブジェクトとして扱う仕組みを指します。 いわゆる Eloquent というORM(Object Relational Mapping)を通じて、テーブルの操作をコードで行えるのが特徴です。 SQLを意識してゴリゴリ書くよりも、わかりやすい書き方でデータの操作を行えるように工夫されているので、初心者でも学びやすいといえるでしょう。
なぜ使われるのか
データベースを扱うときに、テーブルごとにSQLを直接書くのは意外に面倒ですよね。 また、テーブルが増えるとSQLの数もどんどん増えて管理が大変になります。 ORMであるEloquentを使えば、テーブルへの操作をメソッドチェーンのような形で書けるので、可読性や保守性が高まると言われています。 そのうえ、テーブルとコードの紐づけがはっきりしているので、変更点を追いやすくなるのもメリットです。
実務での具体的なシーン
たとえば、ユーザー情報を扱う場面では、users
テーブルを操作する User
というModelを用意するのが一般的です。
顧客データの作成や更新、削除をするときは、Modelを通じて処理を行うことで、バリデーションやイベントフックなどを活用しやすくなります。
ECサイトを作る場合には、注文テーブルを操作する Order
モデルや、在庫テーブルを扱う Stock
モデルを定義して、商品や注文の連携を簡潔に表現するケースもあります。
こうした実務シーンでは、Eloquentの持つリレーション機能が特に便利です。
データベースとのやりとり
Modelを使ってデータベースとやりとりする流れは、それほど複雑ではありません。 大まかには「Model作成 → 実際のCRUD操作」という2ステップに分かれます。 まずはModelを作成する方法を見ていきましょう。
モデルの作成
以下のコマンドで、新しいModelファイルを作成します。 Laravelのプロジェクトがある程度準備されていることを前提として進めていきます。
php artisan make:model Post
このコマンドを実行すると、app/Models/Post.php
というファイルが作られます。
今後は、この Post
モデルを通じて posts
テーブルを操作する形になるのが通常の流れです。
Modelファイルの中身を少し見てみましょう。 まだ何も書き足していない場合、おおむね以下のようなシンプルなコードになっています。
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Post extends Model { use HasFactory; // 必要に応じてカスタマイズ }
このファイルに、テーブル名の指定やfillableプロパティ(ホワイトリスト化したいカラム)などを設定していきます。
基本的なCRUD
CRUDとは、Create(作成)、Read(取得)、Update(更新)、Delete(削除)の頭文字を並べた言葉です。 Modelを使えば、これらの操作を簡単に行えます。
Create(データの作成)
データを新規保存するときは以下のように書くことが多いです。
// 新規にPostモデルをインスタンス化 $post = new Post; // プロパティに値を代入 $post->title = "新しい記事タイトル"; $post->content = "本文の内容が入ります。"; // データベースに保存 $post->save();
あるいは、create
メソッドを使うやり方もあります。
この場合、Model側で $fillable
が指定されていることが前提です。
Post::create([ 'title' => "新しい記事タイトル", 'content' => "本文の内容が入ります。" ]);
Read(データの取得)
データの取得もメソッドチェーンで記述できるので、見通しがよいです。
// 全件取得 $allPosts = Post::all(); // 条件を指定して取得 $somePosts = Post::where('title', 'LIKE', '%Laravel%')->get(); // 1件だけ取得 $singlePost = Post::find(1);
Update(データの更新)
更新の場合も、新規作成のときと似ています。
$post = Post::find(1); // 変更したい値を代入 $post->title = "更新後のタイトル"; $post->save();
Delete(データの削除)
削除の場合は、delete
メソッドを使います。
こちらも流れはシンプルです。
$post = Post::find(1); $post->delete();
これだけでテーブル上の該当レコードが削除されます。
リレーションの基礎
Eloquentでは、複数のテーブルを連携させるときに リレーション を定義します。 たとえば、ある記事(Post)に対して複数のコメント(Comment)が付いているようなケースでは、1対多のリレーションを使います。
1対多や1対1の例
1対多 の例としては、PostとCommentを想定すると分かりやすいでしょう。
Post
モデルには hasMany
メソッド、Comment
モデルには belongsTo
メソッドを定義するのが基本です。
// Postモデル側 public function comments() { return $this->hasMany(Comment::class); } // Commentモデル側 public function post() { return $this->belongsTo(Post::class); }
これで、Postを取得したときに、関連するコメントも簡単に取り出せるようになります。
1対1 の例としては、UserとProfileのような関係が考えられます。 Userは1つだけProfileを持ち、Profileは1人のUserに属するといったイメージです。
リレーションでできること
リレーションを定義すると、以下のような書き方ができるので、わかりやすくなります。
// Postモデルのリレーションを使ってコメントを取得 $post = Post::find(1); $allComments = $post->comments; // 1対多のリレーションをたどる // 逆にCommentモデルからPostを辿る $comment = Comment::find(10); echo $comment->post->title; // コメントされている記事のタイトルを取得
データ同士のつながりをコード上で表現できるので、テーブルを直感的に扱えるのが利点です。
テーブルの外部キー制約や、リレーション先のテーブル構造をどのように決めるかによって、Modelの関数名や設定内容が変わることがあります。
Eager Loadingとは
リレーションを使って複数テーブルからデータを取得するときに、N+1問題 と呼ばれる不要なクエリの多発を避けるための仕組みが Eager Loading です。 要するに、一度に必要なデータをまとめて取得してしまおうという考え方ですね。
Eager Loadingを使う方法
以下のように、with
メソッドを使うときが多いです。
// Postを取得すると同時に、関連するCommentもまとめて取得 $posts = Post::with('comments')->get();
こうすることで、各Postを取得した後でコメントを取りにいくためのクエリが大量に発行されるのを防ぐことができます。 実務でデータ取得量が増えてきたら、Eager Loadingを意識するだけでパフォーマンスが改善されるケースもあるので知っておくと便利です。
Modelで使われるイベントやメソッド
Modelには、データの保存や更新、削除など、ライフサイクルにあわせたイベントが用意されています。 たとえば、saving や deleting などのイベントをフックして、処理を差し込むことが可能です。 大規模なアプリケーションになると、ビジネスロジックをここに書きすぎないように注意する一方で、どうしてもモデルに近い段階で検証や追加処理をしたい場合などに役立ちます。
実務での活用
実務では、たとえば投稿が作成されるタイミングで「ステータスを自動的にセットする」「ユーザーに通知を送る処理をトリガーする」などの実装が考えられます。 こうした動きがModelのイベントを通じて実装できるので、コードが散らばるのを防ぎたい場合には検討してみてもいいでしょう。
まとめ
ここまで、LaravelのModelがどのようにデータベースと連携しているのかを見てきました。 Modelを通じてデータをやりとりするメリットは、複雑になりがちなSQLをあまり意識せずに扱えることと、リレーションでテーブルのつながりをコード上にわかりやすく表現できる点にあります。
投稿やコメント、ユーザー情報など、さまざまなテーブルが登場するWebアプリケーションでは、Modelを上手に活用して柔軟な実装が可能になります。 まずは基本的なCRUDの方法やリレーションを押さえたうえで、必要に応じてEager Loadingやイベントの活用も検討すると、無駄の少ないアプリケーションを組み立てやすくなるでしょう。
Modelの仕組みを理解しておくと、アプリケーションのスケールアップや保守性の向上に役立ちます。 実際の機能追加や拡張の際にもコードが読みやすいため、チーム開発の効率も高まるでしょう。