WinRoadのLaravel4初心者講座

次世代PHPフレームワークのLaravel4を初心者向けに解説して参ります。

Winroad徒然草の管理人がお届けします
hasOneとbelongsTo

hasOneとbelongsTo

このエントリーをはてなブックマークに追加

1対1のリレーション

EloquentORMの醍醐味は、このリレーションではないでしょうか。EloquentORMでは、リレーショナルデータベースの複雑なクエリーをとても簡単に作成してくれます。

リレーションでは、1対1の関係は基本です。Userモデルが、Profileモデルを一つ持つ場合、hasOneを指定します。

hasOne(モデル名、外部キー、内部キー)

hasOneは第1引数に関連づけをするモデル名を記述します。第2引数に、外部キー、第3引数に内部キーを指定します。第2引数の外部キーと第3引数の内部キーは、命名規則どおりに作成されていれば、省略することができます。

それでは、実際に定義してみましょう。

app/models/User.php

class User extends Eloquent{
 public function profile(){
 return $this->hasOne('Profile');
 }
 }
  • 3行目:hasOneメソッドで、Profileモデルを紐付けています。省略されていますが、第2引数は、user_id、第3引数は、idです。つまり、省略されていますので、profilesテーブルに、user_idフィールドがあり、そのuser_idとusersテーブルのidフィールドが紐付けられているということです。
  • たとえば、profilesテーブルにある、u_idフィールド(外部キー)とUserフィールドのIDフィールド(内部キー)が紐付けられている場合は、下記のようになります。
    return $this->hasOne(‘Profile’,’u_id’,’ID’);

belongsTo(モデル名、内部キー、外部キー)

hasOneと逆の関連づけを定義するにはbelongsToを指定します。belongsToは第1引数に、関連づけをするモデル名を記述します。第2引数に、内部キー、第3引数に外部キーを指定します。hasOneと同様に、命名規則通りに作成されていれば、第2、第3引数は省略できます。

それでは、実際に定義してみましょう。

app/models/Profile.php

class Profile extends Eloquent{
 public function user(){
 return $this->belongsTo('User','user_id','id');
 }
 }
  • 3行目:命名規則通りに、作成されていますので、この場合、第2引数と、第3引数は、省略することができます。

関連モデルの呼び出し

関連モデルの紐付け方法はわかったとして、どのように呼び出すのでしょうか。それは、とても簡単です。自分のモデルのプロパティと同様に呼び出すことができます。

app/controllers/UserController.php

public function getIndex(){
 $users=User::all();
 return View::make('user/index',compact($users));
 }
  • 2行目:全てのUserモデルを呼び出して、$userに代入しています。
  • 3行目:呼び出したUserモデルを添付して、ビューファイルを開きます(生成します)。このときには、Profileモデルは呼び出していませんが、UserモデルとProfileモデルはhasOneで関連づけられています。

app/views/user/index.blade.php

<ul>
 @foreach($users as $user)
 <li>{{$user->name}}  年齢:{{$user->profile->age}}歳</li>
 @endforeach
 </ul>
  • 3行目:$user->nameでUserモデルのnameプロパティを呼び出し、$user->profile->ageでUserモデルと紐付けられたProfileモデルのageプロパティを呼び出しています。

« »

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です