データベースを操作するEloquentとは?
データベースの操作にはSQL文が必要です
しかし、LaravelにはEloquent(エロクエント)という
SQL文が分からなくても自動でSQL文に翻訳してくれる機能が存在し
簡素な命令文を記述していくことでデータベースを操作することができます
1対1の関連付けに必要なEloquent
- 親テーブルを操作するモデルへ
hasOneメソッドを記述する - 子テーブルの列(カラム)へ
〇〇〇〇_idという名の外部キーを用意する(重要)
見本のテーブル
ここではusersテーブルを親テーブル
profilesテーブルを子テーブルとして
関連付けを行うものとします。

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を指します
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