【投稿アプリ自作(7)】リレーショナルデータベースからデータを取得・表示する(Laravel)

スポンサーリンク

Webアプリを自作するためにPHPのフレームワークのLaravelを導入することに決めました。
PHP初心者かつLaravel初心者ですが、自分なりにスキルを得るためにLaravelを用いた記事投稿アプリを自作しました。その過程を備忘録としてまとめます。
最終的にはブラウザを利用して記事投稿画面の表示、ユーザごとの記事投稿数のグラフ化を目指したいと思います。
本記事は連載【投稿アプリ自作】の第七回目で、前回作成したダミーデータの取得と表示する方法をまとめます。
※:Laravelは5.3からファイル構成が大幅に変わりました。本記事ではLaravel5.3以降を使って説明したいと思います。
※2:データベースはXAMPPに入っていたMySQLを使うことにします。事前にデータベースアカウントを登録しておいてください。

目次


ゴール


本記事では、以下の2つについてまとめます。
・hasMany()やbelongsTo()関数を使ってリレーションの定義
・入手した情報を画面に表示

以下の画像には前回(第6回目)で作成したダミーデータを使って記事IDごとに各データが格納されているデータベースからデータを入手して、記事の内容を表示したものになります。
本記事ではこのようにデータベース間でのデータの入手ができるようにする方法をまとめます。


必要なもの

必要なもの 価格(円)
1 PC ピンキリ
備考 インターネット接続可能なこと
2 XAMPP 無料
備考 持っていない場合は、こちらを参照→XAMPPのインストール方法
3 Laravelフレームワーク 無料
備考 インストールしていない場合は、こちらを参照→Laravelのインストール方法
4 MySQLのデータベースアカウント 無料
備考 持っていない場合は、こちらを参照→phpMyAdminでデータベースとユーザを新規登録する
5 投稿アプリ向けのテーブル 無料
備考 【投稿アプリ自作】の第四回目で作成した投稿アプリ向けのテーブルです。持っていない場合は、こちらを参照→【投稿アプリ自作(4)】テーブル設計とマイグレーション実行(Laravel)
6 ダミーデータ 無料
備考 【投稿アプリ自作】の第六回目で作成した投稿アプリ向けのダミーデータです。持っていない場合は、こちらを参照→【投稿アプリ自作(6)】seederでダミーデータの作成(Laravel)




事前準備

テーブルの作成


事前に投稿アプリ向けのテーブルを用意する必要があります。
第四回目でテーブル設計と新規テーブルの作成方法をまとめていますので、まだ作成していない方は以下の記事を参考にして新規テーブルの作成をしてください。


テーブルの関連性


投稿アプリ向けのテーブルの関連性をER図にまとめると下の様になります。(IDEDF1X記法で記述)
※ネットで検索しながら見よう見まねで書いたので間違っているかもしれませんがご容赦ください。



ダミーデータの作成


本記事でアクセスするためのダミーデータが必要です。
前回の記事でダミーデータの作成方法をまとめていますので、ダミーデータがない場合は以下の記事を参考にダミーデータの作成をしてください。




Laravelソースファイルの変更

変更や新規作成するLaravelファイル一覧


Laravelのプロジェクトファイル配下にあるファイルで本記事の中で変更、新規作成するファイルについてまとめました。

ファイル名 対応 備考
1 app/Article.php 変更
2 app/ArticleUser.php 変更
3 app/Category.php 変更
4 app/DetailedArticle.php 変更
5 app/Tag.php 変更
6 app/Http/Contoroller/ArticleController.php 変更
7 routes/web.php 変更
8 resources/views/test/test1.blade.php 新規作成
9 resources/views/test/test2.blade.php 新規作成




リレーション定義に使用するメソッドの紹介


以下ではそれぞれのモデルファイルにリレーションの定義をしますが、その前にそもそもリレーション定義に使用するメソッドをまとめたいと思います。

1対1リレーション


1対1関係のテーブルを紐づけるために使用する関数です。

メソッド名 備考
1 hasOne(string $related, string $foreignKey = null, string $localKey = null) APIリファレンス
2 belongsTo(string $related, string $foreignKey = null, string $ownerKey = null, string $relation = null) APIリファレンス

今回の記事では1対1の関係になっているのは「ArticlesテーブルとDetailedArticlesテーブル」の関係になります。
それぞれの関係は以下の様になっており、article_idで1対1に紐づいています。
[Articlesテーブル]
・記事ID :article_id(主キー)
・その他カラム
[DetailedArticleテーブル]
・記事ID :article_id(主キー)
・その他カラム

1対1リレーション定義 hasOne
このとき、DetailedArticleテーブル->Articlesテーブル