PHP-Laravel- プログラミング

【Laravel入門】hasOne リレーションの解説

今回はリレーション、テーブルとテーブルを1対1で結ぶhasOneメソッドを解説します。

Laravelについてよくわからないや。。。という方は、以下を併せて読んでいただけるとご理解いただけると思います。

Laravelとは?現在の、PHPフレームワークの筆頭として大活躍 (akihisa-h.com)

hasOneで1対1リレーション構築

hasOneメソッドは、テーブル間で1対1の関係を構築する時に使います。

例として、会員情報用の「userテーブル」と、各会員の住所を記録した「addressテーブル」があるとします。

このとき「userテーブル」が主で、ユーザー情報を補足している「addressテーブル」は、「userテーブル」に対して従属した関係となっています。
ふたつのテーブルをユーザーIDを介して、リレーションを構築します。

ユーザーIDid
ユーザー名name
メールアドレスemail
パスワードpassword
作成日時created at
userテーブル
IDid
ユーザーIDuser_id
アドレスaddress
作成日時created at
addressテーブル

hasOneメソッドを使ってリレーションを定義する

「userテーブル」側からリレーションを作る方法を考えてみます。

「userテーブル」は、「addressテーブル」にある「ユーザーID」を持っていることになります。

「userテーブル」の側から「addressテーブル」にリレーションを作るときは、【hasOne】メソッドを使います。

hasOneメソッドを使ったリレーションを実践

リレーションを実際に作ってみます。

  1. アドレスモデルとマイグレーションファイルを作成する

「userテーブル」は最初からあるものを使います。「addressテーブル」のモデルとマイグレーションファイルを新たに作成します。
以下コマンドを入力します。

php artisan make : model Address -m

2. 「addressテーブル」のマイグレーションファイルを編集する

作成したマイグレーションファイルは、database/migrationsフォルダの中にあります。ファイルを開き、user_idカラムとaddressカラムを追加します。以下2行をUP関数に追加します。

$table->foreignId('user_id');   
$table->string('address');

php artisan migrate

ファイルを編集して、マイグレートを実行します。

3. 「addressテーブル」にカラムが追加されたことを確認 ⇒ MySQLにデータを追加します。

4. 「Userモデル」にリレーションを追加します。

「Userテーブル」(モデルファイル)を編集して、リレーションを追加します。「app/Models/User.php」ファイルを編集します。

public function address() {
 return $this->hasOne(Address::class);
}

これだけで、Userモデルからaddressモデルを呼び出せるようになりました。すごくシンプルなコードですね。

「addressテーブル」の中の【ユーザーID】のカラム名を変えたり、【ユーザーID】以外のカラムと連携させたりする場合は、コードの書き方が少し変わります。

5. リレーションを確認します

実際にリレーションがどのように動作するかを確認します。routesフォルダの中の「web.php」ルートファイルを編集します。
web.phpファイルの先頭に、名前空間を省略してUserモデルを呼び出せるよう、 use 文をいれておきます。

use App\Models\User;

次に、テストとして下記のようなコードを追加してみます。

Route::get('/{id}/address', function($id){
    $user=User :: find($id);
    return "ユーザー番号".$id."番の住所:".$user->address->address;
});

コードの説明

  • {id}/address ページにアクセスしたら、function() { } の命令を実行します。
  • ユーザーは、$id 番号のユーザーとします。
  • 「”ユーザー番号”.$id.”番の住所:”.$user->address->address;」という文を返してください。$user->address->addressは、このユーザーの、addressテーブルの中にある「アドレス」を取ってくるという意味です。

ブラウザを開き、デフォルトのページのURLに 【/1/address】として、アクセス ⇒内容が表示されればOKです。

主となる側でリレーションを定義する時は「hasOne」を使用します。

以上、リレーション「hasOne」について解説でした。

おすすめ学習書

-PHP-Laravel-, プログラミング