プログラミング

【Laravel】1対1リレーションをわかりやすく解説(belongsTo)

Laravel PHP
【Laravel】1対1リレーションをわかりやすく解説(belongsTo)

Laravelの1対1リレーションのbelongsToについて、公式マニュアルでは専用単語ばかりでどうしてもわかりにくいと感じてしまっている方へ向けて、わかりやすく解説しました。

※例で紹介しているコードについては、一部英語を日本語表記で使用している部分もありますので、コピペで使用する方は必要に応じて置き換えてください。

 

今回は以下のLaravel7系の公式マニュアルを参考にしながらまとめています。

 

親から子へのリレーション(hasOne)について詳しく知りたい方は、以下をご参考ください。

【Laravel】1対1リレーションをわかりやすく解説(hasOne) 【Laravel】1対1リレーションをわかりやすく解説(hasOne)

  Laravelの1対1リレーションのhasOneについて、公式マニュアルでは専用単語ばかりでどうしてもわかりにくいと感じてしまっている方へ向けて、わかりやすく解説しました。 ※例で紹介しているコードについては、一部英語を日本語表記で使用している部分もありますので、コピペで使用する方は必要に応じて置...

 

belongsTo(子から親へ)

 

# 公式より

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Phone extends Model
{
    /**
     * この電話を所有するUserを取得
     */
    public function user()
    {
        return $this->belongsTo('App\User');
    }

}

 

1対1のリレーションとは、とあるテーブルの1つの要素と別のテーブルの1つの要素の関係を結びつけることです。この時、どちらかが複数になることはありません

そのため、イレギュラーがなければ各テーブルの行数は以下の関係が成り立ちます。

親 ≧ 子

 

親のいない子が生まれるということは有りえませんので当然のことです。

※道徳的な意味は除きます

 

ここで重要になるのは、テーブル関係のどちらが親で、どちらが子に該当するかです。これはテーブル内の値の持ち方によって決められます。

 

公式マニュアル通り、ユーザーと電話のテーブルで考えてみましょう。

上記テーブル関係の場合、ユーザーが親電話が子になります。この見分け方は、判別するためのIDを持っているテーブルが子になるということです。電話テーブルにはユーザーを判別するための「ユーザー_id」がありますね。

判別するIDを持っている方が子になる

 

親と子の見分け方がわかったので、次にbelongsToについて見ていきましょう。

公式マニュアルのコードをわかりやすく上記テーブルのように日本語へ置き換えて考えます。 

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class 電話 extends Model
{
    public function ユーザー()
    {
        return $this->belongsTo('App\ユーザー);
    }
}

 

belongsToは子から親に結びつけるためのリレーションなので、電話のモデルに記述します。この時、ユーザーのモデルが存在しなければリレーションができないので、事前に準備しておきましょう。

 

引数の解説

 

belongsTo('モデル', '外部キー[省略可]', 'カスタムキー[省略可]');

 

belongsToでは上記のように第3引数まで設定でき、第2、3引数は省略することが可能です。それでは1つずつ順番に確認していきましょう。

 

 

第1引数

 

モデルには、リレーション先(親)のモデルを指定します。今回であれば、子である電話テーブルに「親のユーザーテーブルと結びつける」という指示を出したいので、第一引数には親に該当するユーザーモデルを指定します。

return $this->belongsTo('App\ユーザー');

 

Laravelのテーブル命名規則に従っていれば、これだけでリレーション関係を結びつけることができます。 

リレーションで役立つLaravelのテーブル命名規則をざっくり解説

  1. 親テーブル側の判別カラムが「id
    ※カスタムプライマリーキーでも可
  2. 子テーブル側の判別カラムが「親テーブル単数名 + _id

 

今回は上記の条件が満たされているので、第2、第3引数は省略可能です。

 

 

第2引数

 

第2引数では、外部キー(foreign_key)を指定することができます。外部キーという表現がわかりにくい場合は「親を判別するための値が格納されている、子テーブルのカラム名」と考えてください。

belongsToの外部キーとは

親を判別するための値が格納されている、子テーブルのカラム名

 

今回のテーブル関係であれば親は「ユーザー」子が「電話」ですね。電話が持つユーザーを判別する値は「ユーザー_id」なので、省略した場合は第2引数にはこの値が初期値としてセットされることになります。

return $this->belongsTo('App\ユーザー', 'ユーザー_id');

 

例えば、テーブルのカラムが以下の用に設定されていたケースで考えてみましょう。

 

これだと第1引数でモデルを指定しても、命名規則に従っていなければどのユーザーのidと電話のどの値が一致する行と結びつければいいかわかりません。上記テーブルであれば、親であるユーザーを判別している値が格納されている子テーブルのカラムは「ユーザー番号」なので、以下のようにリレーションを指定します。 

return $this->belongsTo('App\ユーザー', 'ユーザー番号');

 

こうすることで、リレーション先のカラム名に関係なくリレーション関係を結ぶことができます。

 

 

第3引数

 

第3引数ではカスタムキー(other_key)を指定することができます。こちらもわかりやすく言い換えれば、「親を判別する値が格納された親テーブルが持つカラム」です。第3引数を省略した場合は、親の主キーが格納されます。

belongsToのカスタムキーとは

親を判別する値が格納された親テーブルが持つカラム

 

以下のテーブルで考えてみましょう。

※idの値を使用して判別するのが一般的で、このような格納方法をしているケースはまずありませんが、belongsToをわかりやすく理解するために上記テーブル関係を使用します

 

第2引数では子(電話)が持つ親(ユーザー)を判別する値が格納されたカラムを指定するので「ユーザーの名前」が入ります。そして、第3引数では親(ユーザー)を判別する値が格納された親が持つカラムを指定するので「名前」を指定します。

return $this->belongsTo('App\ユーザー', 'ユーザーの名前', '名前');

 

これでリレーションを結ぶことができました。第3引数までを上手く利用すれば、1対1の関係性が成立していればリレーションを結べます。

 

 

まとめ

 

いかがだったでしょうか。

今回はLaravelの1対1リレーション「hasOneについて」をわかりやすく解説しました。

公式マニュアルを見ても専用単語ばかりで分かりづらいと感じて曖昧なままリレーションを使っていたり、断念してしまった方はぜひ参考にしてくださいね。

 

親から子へのリレーション(hasOne)について詳しく知りたい方は、以下をご参考ください。

【Laravel】1対1リレーションをわかりやすく解説(hasOne) 【Laravel】1対1リレーションをわかりやすく解説(hasOne)

  Laravelの1対1リレーションのhasOneについて、公式マニュアルでは専用単語ばかりでどうしてもわかりにくいと感じてしまっている方へ向けて、わかりやすく解説しました。 ※例で紹介しているコードについては、一部英語を日本語表記で使用している部分もありますので、コピペで使用する方は必要に応じて置...

 

Laravelの基礎を学習したい方は、以下の書籍が参考になります。

PHPフレームワークLaravel入門 第2版 PHPフレームワークLaravel入門 第2版

Laravel使って開発するなら読んでおいて損はないぞ! 入門という名の通り、最初に読むべき1冊や。PHPの最低限の知識は必要やから、そこがまだ十分じゃ無い人はPHPの入門書や実践書に目を通すんやで。 Viewの使い方やbladeの記述方法とか詳しく載ってるから、使ったこと有るけど詳しくは知らん人にとっても「おっ!便...

注目の記事

英語できたらブログで稼げる 【ネオコピペ】
ライティング
ブログ,翻訳,英語
英語できたらブログで稼げる 【ネオコピペ】

  2010年に楽天が社内公用語の英語化を宣言したのは、多くの人が耳にしたことがあるでしょう。 私からすると、「英語ができることは強み」だという考えから、「これからは英語ができないと行きていけないのでは?」と考えを変えさせられるような、そんな出来事でした。   多言語できるデメリットを見つけるのは難...

戦闘不能による交代編 PHPポケモン84
プログラミング
PHP,PHPポケモン,ポケモン
戦闘不能による交代編 PHPポケモン84

戦闘不能による交代 ポケモンが戦闘不能になった際、もし手持ちに戦える状態のポケモンが残っていれば「交代」か「逃げる」の2択になります。今までは手持ちポケモンが1匹のみで判定を行っていたので、今回は交代の選択肢も含めて勝負の判定の見直しをしていきます。   パーティーを含めた勝負判定 味方または...

PHPポケモン「レベルアップ進化編」9
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン「レベルアップ進化編」9

  PHPポケモン(旧:ピカチュウから学ぶオブジェクト指向)も第9回目となりました。前回GitHubよりコードを配布したので、これから学習しようと考えている人は、ぜひ参考にしてください。   最初からコードの内容について学びたい人は、ぜひ記念すべき第1回から順を追って取り組んでみてください。   ...

進化の石編(実装)PHPポケモン103
プログラミング
PHP,PHPポケモン,ポケモン
進化の石編(実装)PHPポケモン103

アイテムによる進化 前回作成した、進化アイテムによる構成の続きです。   進化アイテムとして「かみなりのいし」、ピカチュウの進化判定を作成したので、アイテムの使用から進化処理までを作成、実装します。   今回作成する処理は以下の2点です。 アイテムの使用判定 進化画面への移管   それ...

WordPressをローカルと本番環境で同じ状態にするために理解しておきたい3つのポイントを徹底解説
プログラミング
PHP,phpMyAdmin,WordPress
WordPressをローカルと本番環境で同じ状態にするために理解しておきたい3つのポイントを徹底解説

  WordPressで作ったサイトは通常のサイトと違い、DBが絡んでくるためローカル環境と本番環境を同一の状態で稼働させるには設定や更新されるディレクトリの知識が必要になります。 今回は、WordPressを使ったサイトを作成している人や、開発に挑戦しようとしている人に向けて、ローカルで作ったWordPressのサイ...

挫折してしまう人に共通する3つの要因〜解決方法を紹介します〜
雑記
挫折してしまう人に共通する3つの要因〜解決方法を紹介します〜

  仕事が上手くいかない 思ったように学習成果がでない   こういった理由で挫折してしまう人は、意外にも考え方や行動が共通しています。 それが何かを知り、考え方や環境、対応方法を少し変えるだけで、劇的に余裕が生まれて自己肯定ができるようになります。その結果、強い人になれるのです。   今...

PHPポケモン「わざ編〜チャージ技の実装〜」34
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン「わざ編〜チャージ技の実装〜」34

チャージ技とは ポケモンの技は数多く存在していて、その中でも特別な処理が必要なものがいくつかあります。その1つが「チャージ技」です。 ※チャージ技とはポケモン上で用いられている用語ではありません   現在実装している初代御三家+ピカチュウの初代レベルアップ技の中では以下の2つがあります。 ロ...

売れるECサイトになるために必要な3つの戦略
マーケティング
ECショップ,コンサルティング
売れるECサイトになるために必要な3つの戦略

  ECサイトで全く売れない・・・   ネットショップのオープンが手軽で安価になり、クレジット決済も主流の今ECサイトを立ち上げるお店も増えてきました。 しかし期待感とは裏腹に、思ったような売上が出なかったり、お客さんが1人も獲得できていないケースも少なくありません。   今回はそういった「...

カテゴリ

SEO対策 イベント デザイン ネットワーク ビジネスモデル フリーランス プログラミング マーケティング ライティング 動画編集 雑記

タグ

5G Adobe AfterEffects AI ajax amazon Animate api artisan atom Automator AWS Bluetooth CSS CVR description EC-CUBE4 ECショップ ESLint Facebook feedly foreach function Google Google AdSense Honeycode htaccess HTML IEEE 802.11ax Illustrator Instagram IoT JavaScript jQuery jQuery UI keyword LAN Laravel Linux MacBook MAMP meta MLM MySQL NoCode note OS OSI参照モデル Paypal Photoshop PHP phpMyAdmin PHPポケモン PremierePro rss SEO SEO対策 Sequel Pro Skype SNS SSH Symfony TCP/IP title Toastr Trait Twig Twitter UCC V系 WAN WebSub Wi-Fi wiki Windows WordPress XAMPP xml Xserver YouTube YouTuber Zoom アーティスト アウトプット アクセス層 アニメーション アフィリエイト イーブイ インターネット インプット エンジニア オブジェクト指向 お金配り クリック単価 クリック数 コミュニケーション能力 コロナ コンサルティング サムネイル システムエンジニア スタートアップ スタイルシート スパム データベース ディープフェイク デザイナー デザイン テレワーク ナンパ ニュース ネットワークモデル ノマドワーク バナー ピカチュウ ビジネス フィード フリーランス ブロガー ブログ プログラマー プログラミング プログラミング学習 プログラミング教育 プロトコル ホームページ制作 ポケモン マークアップ マーケティング メール リモートワーク レンダリング 三井住友 三宮 仕事依頼 児童デイ 児童デイサービス 児童発達支援 公開鍵 初心者 助成金 勉強法 営業 広告 広告収入 必勝マニュアル 放課後等デイサービス 朝活 楽天 深層学習 無線LAN 独立 神戸 福祉 秘密鍵 翻訳 自己啓発 英語 見積書 計算機 読書 起業 迷惑メール 配列 銀の弾丸 集客 雑学力