PHPのlaravelで出退勤システムを作っています。
3つのデータベースのテーブルをリレーションさせて、孫テーブルから親テーブルのカラムの値を取得させたいのですが、なかなかうまくいかずご教授いただければ幸いです。
テーブルは以下のような関係になっていて、performancesテーブルと紐づいたusersテーブルのnameカラムを取得しようとしています。
usersテーブル id name
timecardsテーブル id user_id
performancesテーブル id timecard_id
###エラーメッセージ
PHP
1trying to get property 'name' of non-object
該当のソースコード
■モデル
Performance.php
PHP
1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6 7class Performance extends Model 8{ 9 /** 10 * Timecardリレーション 11 */ 12 public function timecard() 13 { 14 return $this->belongsTo(Timecard::class); 15 } 16}
Timecard.php
php
1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6 7class Timecard extends Model 8{ 9 /** 10 * Userリレーション 11 */ 12 public function user() 13 { 14 return $this->belongsTo(User::class); 15 } 16 17 /** 18 * Performance関連付け 19 */ 20 public function performance() 21 { 22 return $this->hasOne(Performance::class); 23 } 24}
User.php
php
1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6use Illuminate\Database\Eloquent\SoftDeletes; 7 8class User extends Model 9{ 10 use SoftDeletes; 11 /** 12 * 利用者テーブル 13 */ 14 protected $table = 'users'; 15 16 /** 17 * Timecardsリレーション 18 * 1対多 19 */ 20 public function timecards() 21 { 22 return $this->hasMany(Timecard::class); 23 } 24}
■コントローラー
PerformanceController.php
php
1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6use App\Performance; 7use App\User; 8 9class PerformanceController extends Controller 10{ 11 public function showPerformanceManagement() 12 { 13 //実績を全て取得 14 $performances = Performance::All(); 15 16 return view('/performanceManagement', [ 17 'performances' => $performances, 18 ]); 19 } 20}
■ビュー
performanceManagement.blade.php
php
1 <tbody> 2 @foreach ($performances as $performance) 3 <tr> 4 <td>{{ $performance->user->name }}</td> 5 </tr> 6 @endforeach 7 </tbody>
試したこと
1: Userモデルにperformancesテーブルへのリレーションを追加
public function performances() { return $this->hasManyThrough(Performance::class, Timecard::class); }
2: Performanceモデルにusersテーブルへのリレーションを追加
public function user() { return $this->belongsTo(User::class); }
public function user() { return $this->belongsToMany(User::class); }
調べたこと
hasManyThroughのように中間テーブルを経由してリレーション出来る、belongsToThroughのようなものがあればと考えたのですが、存在しないようです。
回答1件
あなたの回答
tips
プレビュー