トップページ
Laravel学習サイトLaravelやるばい

目次

リレーション

今回はリレーションについて解説します。

ECサイト作成の間にこの記事が来る理由はECサイト作成の2回目の記事を理解するのにリレーションの知識が必要になるからです。

実務で絶対に使うので頑張って理解して下さい。

やっていることは単純ですので恐らく難しくないと思います。

理解することを最優先にしたいので必要最低限の内容を解説します。


リレーションとは

テーブルにアクセスするのはモデルの役割です。

例えばstocksテーブルに商品情報が入っているとします。

stocksテーブルにアクセスするのはStockモデルですがユーザー(usersテーブルとUserモデル)に紐付いた商品情報を取得したい場合はStockモデルだけではうまくいきません。

どのユーザーの商品情報なのかが分からないのとユーザーの情報にアクセスするのはUserモデルなので。

こんな時はモデルAとモデルBをつないでテーブルAに関するテーブルBの情報を取得すればいいです。

例えばユーザーに紐づく商品情報を取得する時はUserモデルとStockモデルを紐づけてユーザーのテーブルから商品のテーブルの情報を取得します。

このようにモデルAとモデルBを紐づけることでテーブルのカラム(例えばusersテーブルのjonio)に紐づくテーブルのカラム(例えばstocksテーブルのケーキの情報)を取得できてモデルAとモデルBを紐づけることをリレーションと言います。

リレーションには3つのタイプがあり以下になります。

一番よく使うのは恐らく1対多リレーションだと思います。

ECサイトを作るのは1対多リレーションを使います。

3つのタイプは関連づけかたが違うのですが今回は1対多リレーションについて解説します。


1対多リレーション

ショッピングサイトで説明すると理解しやすいと思います。

ユーザーがログインして商品をカートに入れるのをイメージして下さい。

パソコン・マウス・キーボードをカートに入れたとします。

この時1人のユーザーに対して複数の商品が紐づいていると言えます。

1つに対して複数が紐づくのが1対多リレーションです。

1つが所属するテーブルを親テーブルと呼んで複数が所属するテーブルを子テーブルと呼びます。

実際のコードで見ていきます。


前提条件

リレーションをする時は子テーブルのカラムに「親テーブル_id」が必要になります。

例えば親テーブルがusersの場合は子テーブルに「user_id」カラムが必要です。


記述

親テーブルをusersとしてモデルをUserとします。

子テーブルをstocksとしてモデルをStockとします。

リレーションは2つのモデルをつないでテーブルの情報を取得しますが取得の方法は下記の2通りあります。

状況に応じて使い分けますがひとまず親テーブルから子テーブルの情報が取得できればいいのでその説明をします。


親テーブル→子テーブル

親テーブルから子テーブルの情報を取得する時は親モデル(User.php)に下記の記述をします。

public function stocks() {
    return $this->hasMany(Stock::class);
}

関数名は「子テーブル名」にするのがルールです。

子テーブルはstocksなのでこれが関数名になっています。

関数の中身の「Stock」は子テーブルのモデル名です。

それ以外はリレーションをする時の書き方と思っていいです。

「$this->hasMany」ですが親モデルに記述する時は「hasMany」メソッドを使います。

といった感じで記述は簡単です。

これができたらテンプレートでリレーションを使った表示をします。

コントローラーに下記の記述をしたとします。

use App\Models\User;

public function demo() {
    $users = User::all();

    return view('user.index', compact('users'));
}

テンプレートに下記の記述をします。

@foreach ($users as $user)
    {{ $user->stocks->name }}
@endforeach

「$user->stocks->name」のstocksはUserモデルに記述したstocksメソッドです。

nameは子テーブルのカラム名です。

これでユーザーに紐づく商品名を表示することができます。


次の解説

下記のリンクからどうぞ。

https://laravelyarubai.newsite-make.com/post/33/view









戻る