【Laravel】モデルとは?作成から活用法まで解説

Laravelのモデルは、データベースとアプリケーション間のやり取りを簡単にするための便利なツールです。モデルを利用することで、SQLを直接書くことなくデータベースの操作が可能になり、より直感的にデータの取得や保存、更新、削除を行うことができます。

また、LaravelはEloquentというORM(オブジェクトリレーショナルマッピング)を使用しており、これによりデータベーステーブルをクラスとして扱い、オブジェクト指向のアプローチでデータ操作を行えるようになっています。

この記事では、Laravelでモデルを使う方法を具体的な例と共に解説します。モデルの基本的な使い方から、リレーションの活用まで、段階を追って説明するので、初心者の方でもしっかりと理解できる内容になっています。

モデルの作成

Laravelでモデルを作成するには、次のように書きます。

php artisan make:model Post

ここでは、「Post」という名前のモデルを作成しています。このコマンドを実行すると、app/Models ディレクトリにPost.php ファイルが作成されます。

モデルとテーブルの対応関係

Laravelでは、モデル名は自動的にデータベースのテーブル名と紐づけられます。具体的には、モデル名の単数形がテーブル名の複数形に変換されるため、Post モデルはデフォルトでpostsテーブルと対応します。この規約に従っていないテーブルを使用する場合は、モデルクラス内でテーブル名を指定することができます。

class Post extends Model
{
    protected $table = 'custom_table_name';
}

モデルファイルの構造

生成されたモデルファイルの構造は、以下のようになります。

namespace App\Models;

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

class Post extends Model
{
    //
}

モデルの使い方

Laravelのモデルを使うことで、データベース操作を簡潔かつ効率的に行うことができます。ここでは、モデルを通じてデータを取得、作成、更新、削除する基本的な方法を解説します。

レコードの取得

Eloquentを使うと、データベースから簡単にレコードを取得できます。以下は基本的なレコードの取得方法です。

  • 全レコードを取得する
    all() メソッドを使用して、テーブル内のすべてのレコードを取得できます。
$posts = Post::all();
  • 特定のIDのレコードを取得
    find() メソッドで、特定のIDを持つレコードを取得できます。
$post = Post::find(1);
  • 条件付きでレコードを取得
    where() メソッドを使って、特定の条件に合致するレコードを取得します。first() で最初のレコードのみ取得することも可能です。
$post = Post::where('title', 'Sample Title')->first();

レコードの作成

新しいレコードを作成する方法はいくつかありますが、最も基本的な方法はcreate() メソッドを使うことです。なお、$fillable または $guarded プロパティをモデルに設定しておく必要があります。

  • レコードの作成
$post = Post::create([
    'title' => 'New Post',
    'content' => 'This is the content of the post.'
]);
  • save()メソッドを使った作成法
    新しいインスタンスを作成し、save() メソッドで保存することもできます。
$post = new Post;
$post->title = 'Another Post';
$post->content = 'Post content goes here.';
$post->save();

レコードの更新

レコードを更新する場合、find()where() で取得したモデルインスタンスに対して、変更を加えて save() メソッドを呼び出すか、update() メソッドを使います。

  • save()を使った更新方法
$post = Post::find(1);
$post->title = 'Updated Title';
$post->save();
  • update()メソッドを使った更新方法
Post::where('id', 1)->update(['title' => 'Updated Title']);

レコードの削除

レコードの削除には、delete() メソッドを使用します。find()where() で取得したインスタンスに対して削除処理を行います。

  • 単一レコードの削除方法
$post = Post::find(1);
$post->delete();
  • 条件付きでレコードを削除
Post::where('title', 'Old Post')->delete();

モデルのリレーションについて

LaravelのEloquent ORMは、モデル間のリレーションを簡単に定義し、操作することができます。リレーションは、データベースのテーブル間の関係性をプログラム上で表現するもので、例えば、「ユーザが複数の投稿を持つ」、「投稿に複数のコメントがつく」といった関係を実装します。

Eloquentで定義できるリレーションには、以下のような種類があります。

1対1(One to One)

一つのモデルが、他の一つのモデルと関連付けられているリレーションです。例えば、「ユーザが一つのプロフィールを持つ」という関係を記述したい場合は、以下のように書きます。

class User extends Model
{
    public function profile()
    {
        return $this->hasOne(Profile::class);
    }
}

1対多(One to Many)

一つのモデルが、複数のモデルと関連している場合に使用します。例えば、「ユーザが複数の投稿を持つ」という関係は以下のように書きます。

class User extends Model
{
    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}

多対多(Many to Many)

複数存在するモデルが、他の複数モデルと関連しているような場合に使用します。例えば、「投稿が複数のタグを持ち、タグが複数の投稿に属する」ような場合がそれにあたります。

class Post extends Model
{
    public function tags()
    {
        return $this->belongsToMany(Tag::class);
    }
}

リレーションを使ったデータの取得

リレーションを定義すると、それを使って関連するデータを簡単に取得することができます。例えば、ユーザが持つ投稿を取得する場合、次のようにリレーションを使用します。

$user = User::find(1);
$posts = $user->posts;  // ユーザーが持つ全ての投稿を取得

逆に、投稿からそのユーザ情報を取得することも可能です。

$post = Post::find(1);
$user = $post->user;  // 投稿を所有しているユーザーを取得

まとめ

Laravelのモデルは、データベースとのやり取りを直感的かつ効率的に行える便利なツールです。モデルの使い方やリレーションなどの高度な機能を活用することで、データベース操作がより一層簡潔になるかと思います。

Laravelのモデルを効果的に活用することで、メンテナンス性の高いコードを実現し、アプリケーションのスケーラビリティも向上します。ぜひ、自身のプロジェクトでLaravelのモデルを活用して、開発をさらにスムーズに進めてください。

コメント