LoginSignup
0
0

More than 1 year has passed since last update.

【Laravel】データベースのテーブルを関連付けする方法(1対1)

Last updated at Posted at 2022-08-30

データベースを操作するEloquentとは?

データベースの操作にはSQL文が必要です

しかし、LaravelにはEloquent(エロクエント)という
SQL文が分からなくても自動でSQL文に翻訳してくれる機能が存在し
簡素な命令文を記述していくことでデータベースを操作することができます

1対1の関連付けに必要なEloquent

  • 親テーブルを操作するモデルへhasOneメソッドを記述する
  • 子テーブルの列(カラム)へ〇〇〇〇_idという名の外部キーを用意する(重要)

見本のテーブル

ここではusersテーブルを親テーブル
profilesテーブルを子テーブルとして
関連付けを行うものとします。
スクリーンショット 2022-08-30 15.36.24.png

hasOneメソッドとは

hasOneは親テーブルのあるレコードに対して
1つの子テーブルが紐付けられるときに用いられます。
つまり1対1の関連性を付与したい場合に適用します

1対1とは何か(例)

例:マイナンバーカードと人の関係性を表す場合

  • マイナンバーカードは特定の個人を識別するための番号が記されたカードなので1対1になる

例:クレジットカードと人の関係性を表す場合

  • 人はクレジットカードを複数枚持つことがあるので関係性は1対多となる

リレーションにおいて重要なポイント

  • 関連付けするためには親テーブル側と子テーブル側で全く同じな値の列(カラム)が必要です。
  • 見本では親テーブルのidそして子テーブル側のusers_idが同じ値をのため、それが外部キーとして適用されます
  • 元々IDは主キーとして扱われているため、Laravelでのリレーションを設定する際には自動で外部キーとして適用されます
  • 子テーブル側でもIDは主キーとして存在しますがそれとは別に、親テーブルの名前_idという列をあらかじめ登録する必要があります

hasOneメソッドの使い方

app/親テーブルのモデル

class Users extends Model
{
    //hasOne設定
  public function profiles()
  {
      return $this->hasOne('App\Profiles');
  }
}
class 親テーブルの名前 extends Model
{
    //hasOne設定
  public function 子テーブルの名前()
  {
  return $this->hasOne('App\子テーブルのモデル名');
  }
}
  • public function の名前は任意で設定できますが一般的には
    関連させる子テーブルの名前が適切です
  • public function には命名規則がないため全て小文字にします

関連付けに必要なEloquentの外部キー

外部キーとは2つ(もしくはそれ以上の複数)のテーブルを結ぶための
同じ値が入った列のことを指し見本の場合は
usersテーブルのidとprofilesテーブルのusers_idを指します

スクリーンショット 2022-08-30 15.36.24.png

Eloquentによるリレーションの重要な説明

Eloquentによるリレーションでは自動的に以下の列で紐づけするため
子テーブルには必ず次の列(カラム)が必要になります。

列名:「親モデル名_id」 
※よって今回の見本の場合はusers_idが自動で外部キーの扱いになります

コントローラーへの書き方

モデルにてリレーションの設定が済めば、コントローラーで変数にモデルの情報を代入し
ビューへ変数を渡す必要があります


<?php

namespace App\Http\Controllers;
use App\Users;

 public function index()
    {
        $users = Users::all();
        

        return view('welcome',['users' => $users]);


    }


<?php

namespace App\Http\Controllers;
use App\親モデル名;

 public function index()
    {
        $users = 親モデル名::all();
        
        return view('welcome',['親テーブル名' => $親テーブル名]);

    }

  • 変数の渡し方はリレーションの設定をしていても他の変数を渡す時と何も変わりません
  • use宣言は外部のファイルを読み込むための記述です

use宣言がない場合

  • function内部でモデルを参照する際、次のようにフルパスをいちいち宣言しなければなりません
  • namespaceの直下にuse記載がない場合は見本のようなパスを記述しておきます
  • 視認性を良くするためにもuse宣言を利用することが推奨されます。

 public function index()
    {
        $users = \App\親モデル名::all();
        
        return view('ビューのファイル名',['親テーブル名' => $親テーブル名]);

    }

ビューでの使い方

  • ビューに渡した変数はコレクション変数の状態のため複数のレコードがまとまった状態です
  • 繰り返し処理(@foreach)を利用し、1レコードずつに分解する必要があります。
  • 分解したレコードの参照方法は次のとおりです。
@foreach($users as $user)

    <p>{{$user->name}}</p>
    <p>{{$user->profiles->e-mail}}</p>

@endforeach
@foreach($users as $user)

    <p>{{$親テーブル名->親テーブルの列名}}</p>
    <p>{{$親テーブル名->子テーブル名->子テーブルの列名}}</p>

@endforeach
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0