【Laravel】モデルとは:Modelの概要や作成方法について

時計 2023.09.30 / 時計

【Laravel】モデルとは:Modelの概要や作成方法について

記事ではLaravelにおける、モデルについて詳しく解説していきます。

モデルとはMVCモデルのM(Model)にあたり、データベースとアプリケーションの架け橋となる重要な機能です。アプリケーションでデータベース操作(取得・追加・変更・削除)を行うためにモデルは利用されます。

モデルはアプリケーション開発で必ず必要となる機能なので、本記事を通してLaravelのモデルの概要や作成方法などについて理解を深めてください。

本記事ではLaravel10を使っております。

モデル(Model)

ORMとEloquent

ORMとはデータベースとマッピングされたオブジェクトを利用して、データベースを操作する技法のことです。ORMを利用することで、SQLを意識せずにデータベース上のデータを管理することができます。

Laravelでは「Eloquent(エロクアント)」というORMが備わっています。Eloquentによりテーブルをクラスとして定義し、レコードをクラスのインスタンスとして扱うことができます。

モデルとは

Eloquentの「テーブルをクラスとして定義する機能」をモデルが担っています。モデルはテーブルの内容をクラスとして定義し、このクラスを利用してデータベース操作を可能にします。

モデルはMVCモデルの「M」にあたる部分です。データベースとコントローラーの架け橋をしているとイメージするとわかりやすいです。図で描くと以下の赤丸の部分です。

Laravel:モデルとコントローラー、データベースの関係

Laravelの処理の流れがいまいち理解できていない方は以下記事をご参照ください。

MVCモデルとは

MVCモデルとはモデル(Model)・ビュー(View)・コントローラー(Controller)の3つに処理を分けるアプリケーションの設計手法です。アプリケーション開発で必要となる処理を3つに分類することで、開発効率や保守性を高めています。

MVC 説明
モデル(Model) データベースとの架け橋。データにアクセスしてデータの取得・保存・削除を担っています。またデータを扱いやすい形に変換する役割もあります
ビュー(View) フロントサイドを作成(ユーザー側に表示される画面を作る)
コントローラー(Controller) ビューとモデルの仲介役。モデルからデータを取得し、ビューに渡したり、ビューから受け取ったデータをモデルに渡して処理させる

基本的には1つのテーブルに対して1つのモデルを用意します。テーブルとモデルが対応することで、データベースの操作が柔軟に行えます。

テーブルのデータの取得や追加、更新、削除といった全般的な操作はモデルを通して行えるということです。

モデルの作成

モデルを作成するコマンド

モデルはコマンドを使って作成することができます。コマンドプロンプト(またはターミナル)で以下構文に沿ったコマンドを実行します。

注意点

モデルやコントローラーなどを作成するコマンドはartisanファイルがあるプロジェクトフォルダで実行してください

構文

php artisan make:model モデル名

例えばusersテーブルを操作するモデルであれば「User」モデルを作成します。

php artisan make:model User
POINT

モデルの作成と共にマイグレーションファイルも作成したい場合はコマンドの末尾にオプション「-m」を追加してください

php artisan make:model User -m

モデル名は次項で解説する命名規則に沿って付けるようにしてください。

上記コマンドを実行すると、appフォルダ内のModelsフォルダの中にphpファイルが作成されます。

POINT

間違って作成してしまったモデルは手動で削除するだけで問題ないです

モデルの命名規則

Laravelには命名規則として「テーブル名は複数形、モデル名は単数形」で作成するという規則があります。またモデル名の頭文字は大文字(アッパースネークケース)とします。

そのためテーブルusersに対してモデルUserを作成しています。このように命名規則に従ってモデルを作成することで、テーブルとモデルが自動的に関連するようになります。

例えばテーブルcategoriesであれば、モデル名は「Category」となります。

しかし例外もあります。例えばテーブル名が「people」の場合、モデル名は「Person」となりますので注意してください。

この命名規則には準じないテーブルと紐づけたい場合は以下のように、$tableをオーバーライドします。

class Category extends Model
{
    protected $table = 'super_categories';
}

上記のようにすることで指定したテーブルとモデルが紐づけされます。

モデルのソースコード

コマンドでモデルを作成した場合、ファイルの中身は次のようになっています。(ここではモデル名Categoryを作成しています)

<?php

namespace App\Models;

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

class Category extends Model
{
    use HasFactory;
}

ソースコードからわかるように、モデルクラスは「Illuminate\Database\Eloquent」にあるModelを継承したクラスとして作成されます。

use Illuminate\Database\Eloquent\Model;
class Category extends Model

デフォルトでは主キー(プライマリーキー)は「id」となっています。テーブルの主キーがidと異なる場合は$primaryKeyで次のように指定します。

protected $primaryKey = 'category_id';

また主キーは増分整数値(auto increment)を想定しているため、UUIDなどを利用している場合は以下のように増分整数ではないと明示的に宣言します。

public $incrementing = false;

主キーが整数でない場合は$keyTypeにstringを指定します。

protected $keyType = 'string';

モデル作成前の準備

モデルを作成する前にいくつか準備しておくことがあります。まず作成しているアプリケーションをデータベースに接続する作業です。まだデータベースへの接続ができていない方は以下記事を参考にしてアプリケーションをデータベースに接続してください。

次にマイグレーションを実行して、テーブルを作成している必要があります。存在するテーブルに対してモデルを作成するため、テーブルが存在しなければ作成するモデルもありません。マイグレーションの実行については以下記事を参考にしてください。

コントローラーからモデルを通してテーブルからデータを取得

コントローラーを作成して、モデルを通してテーブルからデータを取得する方法を解説していきます。ここではモデルCategoryを使ってテーブルcategoriesからデータを取得してみます。

テーブルcategoriesのマイグレーションファイルは次のようになっており、すでにマイグレーションを実行しているとします。

public function up(): void
{
    Schema::create('categories', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->timestamps();
    });
}

まずコントローラーCategoryControllerを以下コマンドを実行して作成します。

php artisan make:controller CategoryController

次にモデルCategoryを以下コマンドを実行して作成します。

php artisan make:model Category

Category.phpがApp\Models内に作成されます。モデルはなにもせずこのままにしておきます。

作成したコントローラーで次のように記述することでcategoriesテーブルの全レコードをすべて取得します。

<?php

namespace App\Http\Controllers;

// Categoryモデルを呼ぶ
use App\Models\Category;

class CategoryController extends Controller
{
    public function index() {
      $categories = Category::all();
      return view('index', ['categories' => $categories]);
    }
}

上記ソースコードではCategoryクラスのallメソッドを呼び出して、categoriesテーブルの全レコードを取得しています。

最後にviewヘルパー関数でテンプレートを呼び出し、第二引数にテンプレートに渡すデータとして取得した全レコードを指定しています。