Laravelで投稿テーブル(post)を表示すると同時にusersテーブルに格納されているユーザー名を表示するプログラムを作っていた。
それぞれの情報をリレーション設定して紐づけし、正常に表示はされるのだが、メソッド名を任意のものにすると突然表示されなくなってしまった。
その解決方法をメモとして載せておく。
Table of Contents
メソッド名を変更する前のコード
まず、変更前の正常に表示されたコードは下記の通りだ。
public function user() {
return $this->belongsTo(User::class);//>belongsToで一つの投稿(Post)に一人のユーザー(User)を紐づけ
}
public function posts() {//リレーション設定
return $this->hasMany(Post::class);//>hasManyで一人(User)のユーザーが複数の投稿(Post)を持つ場合に使用
}
@foreach($posts as $post)<!-- postsテーブルの中身をある分だけ出す -->
<h1>{{$post->title}}</h1>
<p>{{$post->body}}</p>
<p>{{$post->created_at}} / {{$post->user->name??'匿名'}}</p>
@endforeach
このPost.phpのメソッド名を、例えばuserinforなどに変え、bladeの「user->」部分も「userinfor->」に変えたのだが、なぜか表示されなくなってしまう。
メソッド名を変更すると表示されなかった理由
結論をいうと、どうやらLaravelの仕様が関わっているようだ。
メソッド名を「userinfor」などにすると、Laravelが勝手に架空の外部キーを推測(user_infor_idなど)してしまうため、別カラムを参照してしまう不具合が起こるようだ。
メソッド名が「user」のままだった場合、Laravel はデフォルトで user_id を使用するため、特に問題は起きなかったということだ。
解決方法としては、下記のように何の外部キーを参照するのかを明示的に書く必要がある。
public function userinfor() {
return $this->belongsTo(User::class, 'user_id');
}
これに伴い、bladeのメソッド名も変更すると、正常に表示された。
@foreach($posts as $post)<!-- postsテーブルの中身をある分だけ出す -->
<h1>{{$post->title}}</h1>
<p>{{$post->body}}</p>
<p>{{$post->created_at}} / {{$post->userinfor->name??'匿名'}}</p>
@endforeach
以上。