質問編集履歴

1 質問を要約し、短くしました。

waiemu

waiemu score 14

2018/09/26 10:48  投稿

Laravel 5.6 中間テーブルを元にデータを出力する方法
### 前提・実現したいこと
前回質問させていただいた内容を誤って解決済みにしてしまったので、改めて質問させていただきます。  
PHP(Laravel5.6)でイベントの出席管理のシステムを作っています。
- PHP7.2
- Laravel5.6
- MySQL5.6
会員情報というテーブルとイベント情報というテーブルを作って、イベントに参加した人を中間テーブルに記録しています。
**usersテーブル**
|id|name|age|
|:--|:--:|--:|
|1|一郎|30|
|2|次郎|29|
|3|三郎|28|
**eventsテーブル**
|id|name|date|
|:--|:--:|--:|
|1|テスト会1|2018/09/01|
|2|テスト会2|2018/09/10|
**user_eventテーブル**
|id|user_id|event_id|attendance_status|
|:--|:--:|--:|
|1|1|2|attend|
|2|1|1|absence|
|3|2|1|attend|
|4|2|2|attend|
(※user_eventテーブルのuser_id と event_id は各テーブルのidを外部キーとして作成。)
会員情報とイベント情報はそれぞれ「一覧・詳細・編集・作成」ページを作っています。
イベント情報の「詳細」ページでイベントの参加(attend)しているユーザーを出力したいのですが、出力する方法がわかりません。
### 該当のソースコード
app/Events.php
``` 
class Event extends Model
{
   protected $table = "events";
   protected $fillable = [
       'name', 'date',
   ];
   public function users()
   {
       return $this->belongsToMany('App\User', 'user_event', 'user_id', 'event_id');
   }
}
```
app/Users.php
``` 
class User extends Authenticatable
{
   protected $fillable = [
       'name', 'age',
   ];
   public function events()
   {
       return $this->belongsToMany('App\Event', 'user_event', 'event_id', 'user_id');
   }
}
```
app/Http/Controller/EventController.php
``` 
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\DB;
use App\Event;
use App\User;
class EventController extends Controller
{
 public function show(Event $event, User $user)
    {
       $userevents = DB::table('user_event')->get();
       foreach ($userevents as $userevent) {
           $users = $userevent->user;
           $events = $userevent->event;
       }
       return view('events.show', ['event' => $event, 'users' => $users]);
   }
}
```
resources/views/events/show.blade.php
``` 
<h2>{{ __('イベントの参加者') }}</h2>
   <div class="table-responsive">
       <table class="table table-striped">
           <thead>
               <tr>
                   <th>{{ __('名前') }}</th>
                   <th>{{ __('年齢') }}</th>
                   <th></th>
               </tr>
           </thead>
           <tbody>
              <tr>
               @foreach ($event->users as $user)
                   <td>{{ $user->pivot->family_name }}</td>
               @endforeach
               </tr>
           </tbody>
```
### 出たエラー
Undefined property: stdClass::$user
### 試したこと
[Laravel 5.6 Eloquent:リレーション 多対多](https://readouble.com/laravel/5.6/ja/eloquent-relationships.html#many-to-many)
上記ドキュメントを見ながら、
```
$user = User::find(1);
foreach ($user->events as $event) {
   echo $event->pivot->created_at;
}
```
と記述し、試してみましたが、何も出力されません。
この書き方で、どのような処理がされているのか、よくわかっていません。  
 
>  
取得したそれぞれのRoleモデルはpivot属性と自動的に結合されます。この属性は中間テーブルを表すモデルを含んでおり、他のElouquentモデルと同様に使用できます。  
 
>  
デフォルトでモデルキーはpivotオブジェクト上のものを表しています。中間テーブルがその他の属性を持っている場合、リレーションを定義するときに指定できます。  
 
とありますが、ここの文章の意味が良くわかりません。  
今このpivotは何を指しているのでしょうか?  
 
考え方として、  
 
user_eventテーブルに登録されている[event_id]を参照し、そのカラム上の[user_id]を取得し、該当するidのユーザー情報を出力すること   
 
が実現したいことです。  
できましたら読むべきLaravelのドキュメントや学ぶべきPHPの概念など、この問題を解決するために抜けている知識をご指摘いただければ幸いです。
何卒よろしくお願いします。
  • PHP

    31319 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • MySQL

    9512 questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • Laravel

    2752 questions

    LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

  • Laravel 5

    3151 questions

    Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る