Fippiyのプログラム学習内容アウトプットBlog

日々の学習内容をアウトプットして振り返りを実施する。

Laravel開発、ユーザー所有書籍を管理できるようにする【1】テーブルを追加して既存テーブルとリレーションを設定する

今までに作成したアプリは、アプリ内に本の情報を登録できるという物でした。

単に登録するだけでなく、今回は各ユーザーが所有している本として登録できる状態にします。

 

今回の目的

ユーザーが所有する本を登録するためのテーブルを作成する

作成したテーブル情報をビューで表示できるようにする

なぜやるか

ユーザーが所持している本を管理できるようにする為のプロセス。

テーブルを作成することで、今後の工程でデータ保存・変更・削除が行えるようにする。

テーブル作成完了後に実際にテーブルからデータを引き出せるようになっているか確認することを確認して次の工程にすすむため。

最終的に、ユーザーページで出来る事を完成させる。

やりたいこと

本所有情報テーブルを新規作成する。

User,Bookdataテーブルと本所有情報テーブルとの関連性を設定する。

テーブル関係しを利用してデータを引き出し、ビューで表示できることを確認する。

やったこと

DBにテーブルを追加する

追加したテーブルと既存テーブルの関係性を設定する

関係性を利用してデータを表示させる

 

実施内容

テーブルを追加して所有物情報を扱う

テーブル構成を確認する

最終的なRDBの構成はなんとなく作成していますが、順を追って作成しています。

今まで作成したアプリのDBは現在このようになっています。

# テーブル構成 

f:id:Fippiy:20190408211607p:plain

DB

Book情報とUser情報を作成した状態です。現在は特に関係性もなく単独で作っただけの状態です。

Book情報登録を主に作成してきました、Userに関してはいまのところはログインする為につけたというのが現状です。

 

テーブル設計してテーブルを増やす

ここにユーザーが所有している本の情報を登録できるようにします。

# テーブル構成

f:id:Fippiy:20190408211626p:plain

DB変更後


テーブルを追加してリレーションを組み、どのユーザーが何を所有しているかという状態をつくります。

まず最低限の関連性を組み込みビューで表示できることを目指します。

--------

新たなDBを作成する

マイグレーションファイルの追加

DBを作成するためにマイグレーションファイルを追加

php artisan make:migration create_property_table

ここに新たなカラムを追加します

# ~/database/migrations/xxxx_create_property_table.php

f:id:Fippiy:20190408213156p:plain

マイグレーションファイル

そしてDBを作成します。

php artisan migrate

 

モデルの作成

続いて対応するモデルも作成します。

$ php artisan make:model Property

# ~/app/Property.php

f:id:Fippiy:20190408214314p:plain

モデル設定

リレーション先情報を保存する為、全てのデータは必須項目となります。

 

コントローラ修正 

コントローラで扱うデータを設定

# ~/app/Http/Controllers/UserController.php

f:id:Fippiy:20190408215702p:plain

コントローラ設定

DBを扱える様にし、まずは全データをそのまま表示できるように設定。

 

ビューで表示できるように修正

新規作成テーブル情報をまず取り出せることの確認です。

テーブルの関係性をもった情報を出すのが目的ですが、まずはきちんと対象のテーブル情報が出力されることを確認するためです。

# ~/resource/views/user/index.blade.php

f:id:Fippiy:20190408215855p:plain

ビュー表示修正

propertyDBに情報が全くない状態なので、とりあえず直接DBにデータをいれて表示をまず試すことに。

# データベース(手動登録)

f:id:Fippiy:20190408215955p:plain

DB

ここまででビュー表示を確認。

f:id:Fippiy:20190408220053p:plain

データ表示エラー

エラーとなり表示できませんでした。

 

テーブル名を正しく設定する

このエラーから分かったことは、DB名が"properties"となっています。そもそもDB名を複数形に出来ていなかったのです。

DBを改めて作り直します。

propertyテーブルが不要となった為、ロールバックを実施してpropertyマイグレーションファイルを削除、それにともなうmigrationsテーブルからpropertyテーブルをマイグレーションしていた情報も削除します。

そして、propertiesテーブルとしてマイグレーションファイルを新たに作成

php artisan make:migration create_properties_table

 

# ~/database/migrations/xxxx_create_properties_table.php

f:id:Fippiy:20190408221125p:plain

propertiesテーブルとして再作成

これをマイグレーションしてDBの修正をしました。

 

ビューでデータが表示表示確認する

この状態で保存したDB情報を出力しようとしたのですが、$propertyに全データを格納しているにも係わらず単独のデータとして扱おうとしていました。

まず1件を出力出来るように修正します。

# ~/app/Http/Controllers/UserController.php

f:id:Fippiy:20190408222338p:plain

コントローラ

first()によってまず1件のみに設定。

 

 

これでビュー表示の確認

f:id:Fippiy:20190408222434p:plain

登録DB出力

ID1をビューに表示させました。

まずこれでpropertiesテーブルの情報を出力できました。

 

リレーション設定する

モデルに設定を追加する

次はリレーション設定を行い、propertiesテーブルからbookdataテーブルを参照して本のタイトルを表示できるようにします。

まず、モデルファイルにリレーション関係を設定します。

# ~/app/Bookdata.php

f:id:Fippiy:20190408225908p:plain

Bookdataモデル

一つの本に対して複数の所有者がいるという関係性を設定しました、hasMany設定を追加します。

 

所有情報に対しても設定を追加します。

# ~/app/Property.php

f:id:Fippiy:20190408230136p:plain

Propertyモデル

hasManyに対する対向の設定としてbelongsTo設定をいれます。

user情報との紐付けもするため、併せて設定をいれています。

 

リレーションを使用したビュー表示設定

リレーション関係設定が完了したので、ビューの処理を変更します。

# ~/resource/views/user/index.blade.php

f:id:Fippiy:20190408230313p:plain

ビューファイル修正

property情報からbookdataテーブルを参照し、タイトル名を取得する設定です。

 

ビューで表示を確認

f:id:Fippiy:20190408230440p:plain

タイトル情報の取得

タイトルが表示できました。

 

以上でリレーションを設定して関連データを表示させる処理は完了です。

 

 

この後、ビュー表示の修正と所有書籍の登録という工程があります。

まずはビュー表示を修正することから実施しました。

fippiy.hatenablog.jp