【laravel】リレーション「Attempt to read property "name" on null」のエラーを解消したい

実現したいこと

laravel初心者です。
二つのテーブルをリレーションしてビューに表示させたいのですが、「Attempt to read property "name" on null」のエラーが出てうまく表示ができません。

表示させたいもの:選手テーブルplayersと出身国テーブルcountriesの中のname(国の名前)
playersテーブルのcountry_idとcountriesのidをリレーションして、該当の選手の出身国を一覧に表示させたいと考えています。

色々調べて書き換えてみたりしましたが、表示ができても国の名前が全部表示されてしまったりとうまくいかず苦戦しております。
お手数ですがご教示いただけますと幸いです。

前提

該当のソースコード

■コントローラー

php

1use Illuminate\Http\Request;2use Illuminate\Database\Eloquent\Model;3use Illuminate\Support\Facades\DB;4use App\Models\Players;5use App\Models\Countries;6 7class PlayerController extends Controller8{9 //選手一覧ページ10 public function index(){11 $playerTable = new Players;12 $players = $playerTable->allPlayers(); //playersの一覧表示13 14 $countries = Players::with('countries:id,name')->get();15 16 return view('Players.index',compact('players','countries')) ;17 }18

■ビュー

php

1@foreach($players as $player)2 <tr>3 <th>{{ $player->id }}</th>4 <th>{{ $player->uniform_num }}</th>5 <th>{{ $player->position }}</th>6 <th>{{ $player->club }}</th>7 <th>{{ $player->name }}</th>8 <th>{{ $player->birth }}</th>9 <th>{{ $player->height }}</th>10 <th>{{ $player->weight }}</th>11 <th>{{ $player->countries->name }}</th> //ここのnameでエラーが出ます12</tr>13@endforeach

■国モデル

php

1use Illuminate\Database\Eloquent\Factories\HasFactory;2use Illuminate\Database\Eloquent\Model;3 4class Countries extends Model5{6 use HasFactory;7 8 public function players(){9 return $this->belongsTo(Players::class,'id','country_id');10 }11}

■選手モデル

php

1use Illuminate\Database\Eloquent\Factories\HasFactory;2use Illuminate\Database\Eloquent\Relations\HasMany;3use Illuminate\Database\Eloquent\Relations\BelongsTo;4use Illuminate\Database\Eloquent\Model;5use Illuminate\Database\Eloquent\SoftDeletes;6 7class Players extends Model8{9 use HasFactory;10 use SoftDeletes;11 public function countries(){12 return $this->hasOne(Countries::class,'id','country_id');13 }

試したこと

  1. ビューを{{ $player->countries()->name }}に書き換えてみる

→「Undefined property: Illuminate\Database\Eloquent\Relations\HasOne::$name」のエラー

2.テーブル結合を使って書いてみる

php

1$countries = DB::table('players') // 主となるテーブル名2 ->join('countries', 'countries.id','=','players.country_id') 3 ->select('players.id', 'countries.id as country_id', 'countries.name as country_name')4 ->get();

→エラーかわらず

補足情報(FW/ツールのバージョンなど)

laravel10を使用しています

コメントを投稿

0 コメント