今回はリレーション、テーブルとテーブルを1対1で結ぶhasOneメソッドを解説します。
Laravelについてよくわからないや。。。という方は、以下を併せて読んでいただけるとご理解いただけると思います。
Laravelとは?現在の、PHPフレームワークの筆頭として大活躍 (akihisa-h.com)
hasOneで1対1リレーション構築
hasOneメソッドは、テーブル間で1対1の関係を構築する時に使います。
例として、会員情報用の「userテーブル」と、各会員の住所を記録した「addressテーブル」があるとします。
このとき「userテーブル」が主で、ユーザー情報を補足している「addressテーブル」は、「userテーブル」に対して従属した関係となっています。
ふたつのテーブルをユーザーIDを介して、リレーションを構築します。
ユーザーID | id |
ユーザー名 | name |
メールアドレス | |
パスワード | password |
作成日時 | created at |
ID | id |
ユーザーID | user_id |
アドレス | address |
作成日時 | created at |
hasOneメソッドを使ってリレーションを定義する
「userテーブル」側からリレーションを作る方法を考えてみます。
「userテーブル」は、「addressテーブル」にある「ユーザーID」を持っていることになります。
「userテーブル」の側から「addressテーブル」にリレーションを作るときは、【hasOne】メソッドを使います。
hasOneメソッドを使ったリレーションを実践
リレーションを実際に作ってみます。
- アドレスモデルとマイグレーションファイルを作成する
「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 Webアプリケーション開発 バージョン8.x対応 [ 竹澤 有貴 ] 価格:4180円 |
Laravelの教科書 きほんからデータベース連携までLaravelがわかる!/加藤じゅんこ【3000円以上送料無料】 価格:3300円 |
PHPフレームワークLaravel入門第2版 [ 掌田津耶乃 ] 価格:3300円 |
PHPフレームワークLaravel実践開発 [ 掌田津耶乃 ] 価格:3300円 |