データベースを操作する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