現在Laravelの教材を鋭意制作中です!完成まで今しばらくお待ちください

#24 お問い合わせ内容を表示する

前章まででお問い合わせフォームの根幹部分は作成できました。

この章からは、お問い合わせフォームに投稿された内容を確認できる一覧ページを作成していきたいと思います。

今回はあくまで練習用のアプリとなりますので、indexページ、つまりtopページにお問い合わせ一覧を表示させるようにしています。

それでは実装していきましょう。

1. pullとブランチの作成

まずは、もうお分かりですね。作業に入る前に前回mergeしたメインブランチを更新しておきましょう。

# ブランチをpullする
git pull origin main

以上で完了です。mainブランチが前章で作成されたブランチと同じになれば、次に進みます。

git switch -C make-index

今回はindexページを作成するので、安直ですがmake-indexと言う名前のブランチを作成しました。ブランチ名は任意となりますので、お好きなブランチ名を付けて構いません。

2.ContactController.phpの実装

use App\Models\Contact;

public function index()
{
  $contacts = Contact::latest()->get(); // 新しい順に取得

  return view('index', ['contacts' => $contacts]);
}

コードの解説

$contacts = Contact::latest()->get();

Contact::latest()->get()によって created_at カラムを基準に、最新の順でデータを取得します。

取得したデータは配列で、 $contacts に代入されます。入力されたデータは以下のようなものです。

// contactsにはこんな配列が入っています。
[
App\Models\Contact {
  id: 1,
  name: "山田太郎",
  email: "taro@example.com",
  age: 32,
  gender: "男性",
  interests: "Laravel構築,SEO相談",
  message: "お問い合わせ内容の例です。",
  created_at: "2025-07-01 18:45:00",
  updated_at: "2025-07-01 18:45:00"
},
App\Models\Contact {
  id: 2,
  name: "佐藤花子",
  email: "hanako@example.com",
  age: 28,
  gender: "女性",
  interests: "",
  message: "別の問い合わせ内容です。",
  created_at: "2025-07-01 18:50:00",
  updated_at: "2025-07-01 18:50:00"
},
// ...さらに続く
]

データベースのテーブルに入っているデータをすべて引っ張って、配列にしています。

return view('index', ['contacts' => $contacts]);

ここで新しい書き方が登場しています。['contacts' => $contacts]ですが、 $contacts(問い合わせデータの一覧)を 'contacts' というキー名でビューに渡しています。

早い話が、コントローラーで取得したデータをビューに渡すために記述されています。

まずは先にビュー側を作ってみましょう。データがどのように渡されているのかわかると思います。

3.index.blade.phpの実装

@extends('layouts.app')

@section('title', 'お問い合わせ一覧')

@section('content')
<h2>お問い合わせ一覧</h2>

@if ($contacts->isEmpty())
  <p>まだお問い合わせはありません。</p>
@else
<table border="1" cellpadding="8" cellspacing="0">
  <thead>
    <tr>
      <th>ID</th>
      <th>名前</th>
      <th>メール</th>
      <th>年齢</th>
      <th>性別</th>
      <th>送信日時</th>
      <th>詳細</th>
    </tr>
  </thead>
  <tbody>
@foreach ($contacts as $contact)
    <tr>
      <td>{{ $contact->id }}</td>
      <td>{{ $contact->name }}</td>
      <td>{{ $contact->email }}</td>
      <td>{{ $contact->age }}</td>
      <td>{{ $contact->gender }}</td>
      <td>{{ $contact->created_at }}</td>
      <td>詳細</td>
    </tr>
@endforeach
  </tbody>
</table>
@endif
@endsection

コードの解説

@if ($contacts->isEmpty())
  <p>まだお問い合わせはありません。</p>
@else

$contactsが空の時、「まだお問い合わせはありません」と表示されます。

isEmpty()メソッドは Laravelで取得したデータのまとまりが空かどうかを判定するためのものです。

@foreach ($contacts as $contact)
    <tr>
      <td>{{ $contact->id }}</td>
      <td>{{ $contact->name }}</td>
      <td>{{ $contact->email }}</td>
      <td>{{ $contact->age }}</td>
      <td>{{ $contact->gender }}</td>
      <td>{{ $contact->created_at }}</td>
      <td>詳細</td>
    </tr>
@endforeach

このコードは問い合わせデータを一覧表示するためのテーブルを生成するものです。

このテンプレートでは、取得した問い合わせデータを1件ずつ表示するために、@foreach を使ってループ処理をしています。

@foreach ($contacts as $contact) でデータを1件ずつループ処理するBlade構文となり、Controllerで指定した['contacts' => $contacts]につながってくるわけです。

また、ループ処理を使用しているので、表示する件数が多くなっても対応が可能となっています。

各データはテーブルの1行として表示され、その中に問い合わせの「ID・名前・メールアドレス・年齢・性別・作成日時」などが入ります。

例えば、1件目の問い合わせが name: "山田太郎" email: "taro@example.com" のような内容だった場合、その情報が <td>タグの中に埋め込まれ、HTMLテーブルに反映されます。

今のところ「詳細」欄はプレーンな文字列だけですが、次の章にてリンクを作成していきます。

4.compact()について

少し戻ってコントローラーのお話になります。

今は ['contacts' => $contacts] という形でビューに値を渡していますが、Laravelにはこの部分を短く書ける compact() という便利な関数があります。

たとえば return view('index', compact('contacts')); とすると、自動的に 'contacts' => $contacts のように展開してくれます。

つまり、変数名とキー名が一致していれば省略できるという仕組みです。

use App\Models\Contact;

public function index()
{
  $contacts = Contact::latest()->get(); // 新しい順に取得

  return view('index', compact('contacts'));
}

compactを使わないとき

1. 明示的に渡したいとき

return view('dashboard', [ 'user' => $user, 'notifications' => $notifications, ]);

配列で書くと「キー名と値の関係」が明確に見えるので、第三者にも伝わりやすいです。特にチーム開発やレビューで好まれます。

2. リファクタリングで安全性重視のとき

compact() は文字列で変数名を渡すので、もしスペルミスをしてもPHPがエラーを出さずに null を渡してしまうことがあります。

$usre = 'taro'; // ミススペル
return view('profile', compact('user')); // 'user' 変数がない → null が渡る

明示的な配列の方が、こうしたミスを見つけやすいです。

3. 変数とビューのキー名をずらしたいとき

$name = 'taro';
return view('hello', ['displayName' => $name]); // compact ではできない

compact() は「変数名=キー名」で使う関数なので、ビューで別の名前を使いたいときは不向きです。

4. 可読性・統一ルールを優先するプロジェクトの場合

プロジェクトによっては「ビューへのデータはすべて明示的に書く」ルールを決めている場合があります。

Laravel初心者にも伝わりやすいように、あえて compact() を避けるケースです。

5.Git push

以上が完了したら、ここでGitを共有しておきましょう。

git add -A
git commit -m "コメントを入力する"
git push origin make-index

git pushが無事完了したら、GitHub上で操作を行います。

pull requestが来ているので、mergeしましょう。

次章:#25 詳細ページを作成する に進む