Laravel開発、ユーザー所有書籍を管理できるようにする【1】テーブルを追加して既存テーブルとリレーションを設定する
今までに作成したアプリは、アプリ内に本の情報を登録できるという物でした。
単に登録するだけでなく、今回は各ユーザーが所有している本として登録できる状態にします。
今回の目的
ユーザーが所有する本を登録するためのテーブルを作成する
作成したテーブル情報をビューで表示できるようにする
なぜやるか
ユーザーが所持している本を管理できるようにする為のプロセス。
テーブルを作成することで、今後の工程でデータ保存・変更・削除が行えるようにする。
テーブル作成完了後に実際にテーブルからデータを引き出せるようになっているか確認することを確認して次の工程にすすむため。
最終的に、ユーザーページで出来る事を完成させる。
やりたいこと
本所有情報テーブルを新規作成する。
User,Bookdataテーブルと本所有情報テーブルとの関連性を設定する。
テーブル関係しを利用してデータを引き出し、ビューで表示できることを確認する。
やったこと
DBにテーブルを追加する
追加したテーブルと既存テーブルの関係性を設定する
関係性を利用してデータを表示させる
実施内容
テーブルを追加して所有物情報を扱う
テーブル構成を確認する
最終的なRDBの構成はなんとなく作成していますが、順を追って作成しています。
今まで作成したアプリのDBは現在このようになっています。
# テーブル構成
Book情報とUser情報を作成した状態です。現在は特に関係性もなく単独で作っただけの状態です。
Book情報登録を主に作成してきました、Userに関してはいまのところはログインする為につけたというのが現状です。
テーブル設計してテーブルを増やす
ここにユーザーが所有している本の情報を登録できるようにします。
# テーブル構成
テーブルを追加してリレーションを組み、どのユーザーが何を所有しているかという状態をつくります。
まず最低限の関連性を組み込みビューで表示できることを目指します。
--------
新たなDBを作成する
マイグレーションファイルの追加
DBを作成するためにマイグレーションファイルを追加
$ php artisan make:migration create_property_table
ここに新たなカラムを追加します
# ~/database/migrations/xxxx_create_property_table.php
そしてDBを作成します。
$ php artisan migrate
モデルの作成
続いて対応するモデルも作成します。
$ php artisan make:model Property
# ~/app/Property.php
リレーション先情報を保存する為、全てのデータは必須項目となります。
コントローラ修正
コントローラで扱うデータを設定
# ~/app/Http/Controllers/UserController.php
DBを扱える様にし、まずは全データをそのまま表示できるように設定。
ビューで表示できるように修正
新規作成テーブル情報をまず取り出せることの確認です。
テーブルの関係性をもった情報を出すのが目的ですが、まずはきちんと対象のテーブル情報が出力されることを確認するためです。
# ~/resource/views/user/index.blade.php
propertyDBに情報が全くない状態なので、とりあえず直接DBにデータをいれて表示をまず試すことに。
# データベース(手動登録)
ここまででビュー表示を確認。
エラーとなり表示できませんでした。
テーブル名を正しく設定する
このエラーから分かったことは、DB名が"properties"となっています。そもそもDB名を複数形に出来ていなかったのです。
DBを改めて作り直します。
propertyテーブルが不要となった為、ロールバックを実施してpropertyマイグレーションファイルを削除、それにともなうmigrationsテーブルからpropertyテーブルをマイグレーションしていた情報も削除します。
そして、propertiesテーブルとしてマイグレーションファイルを新たに作成
$ php artisan make:migration create_properties_table
# ~/database/migrations/xxxx_create_properties_table.php
これをマイグレーションしてDBの修正をしました。
ビューでデータが表示表示確認する
この状態で保存したDB情報を出力しようとしたのですが、$propertyに全データを格納しているにも係わらず単独のデータとして扱おうとしていました。
まず1件を出力出来るように修正します。
# ~/app/Http/Controllers/UserController.php
first()によってまず1件のみに設定。
これでビュー表示の確認
ID1をビューに表示させました。
まずこれでpropertiesテーブルの情報を出力できました。
リレーション設定する
モデルに設定を追加する
次はリレーション設定を行い、propertiesテーブルからbookdataテーブルを参照して本のタイトルを表示できるようにします。
まず、モデルファイルにリレーション関係を設定します。
# ~/app/Bookdata.php
一つの本に対して複数の所有者がいるという関係性を設定しました、hasMany設定を追加します。
所有情報に対しても設定を追加します。
# ~/app/Property.php
hasManyに対する対向の設定としてbelongsTo設定をいれます。
user情報との紐付けもするため、併せて設定をいれています。
リレーションを使用したビュー表示設定
リレーション関係設定が完了したので、ビューの処理を変更します。
# ~/resource/views/user/index.blade.php
property情報からbookdataテーブルを参照し、タイトル名を取得する設定です。
ビューで表示を確認
タイトルが表示できました。
以上でリレーションを設定して関連データを表示させる処理は完了です。
この後、ビュー表示の修正と所有書籍の登録という工程があります。
まずはビュー表示を修正することから実施しました。