Userモデルに複数のPostモデルが関連付けられている、あるユーザーの投稿一覧を取得したいような場合には、User モデルに Post モデルと 1対多のリレーションを定義する必要があります。定義の仕方を確認します。
親記事
Dockerで環境構築して Laravel 9で CRUD 機能を作る
2022年03月15日
Laravel環境
- macOS
- Laravel v9.0.2
- Docker 20.10.12
1対多のリレーション
Post モデルには、User モデルの主キーのidに関連付けされている、外部キーの user_id が保存してあります。ユーザーモデルから関連するポストモデルを使いたいときには、1対多のリレーション hasMany(Post::class) を定義します。
public function posts()
{
return $this->hasMany(Post::class);
//return $this->hasMany('App\Comment', 'foreign_key', 'local_key');
}
3: UserモデルでhasMany(Post::class) で主キーのidが Post モデルの外部キー user_id と関連付けされます。
Userモデルの 小文字の user + _id が外部キーとして自動的に決まります。
4: 外部キーに user_id を使わないなら、第二引数に値を渡します。
4: 主キーのid 以外のidを使いたいなら、第三引数に値を渡します。
使用する
ダッシュボードに現在認証済みのユーザーの投稿一覧を取得して表示させていきます。
ルート
Route::get('/dashboard', [UserController::class, 'index'])
->middleware(['auth'])
->name('dashboard');
UserController
public function index()
{
$user = User::find(auth()->id());
$user->posts = $user->posts()->orderByDesc('created_at')->paginate(5);
return view('dashboard', ['user' => $user]);
}
現在認証済みのユーザーの投稿の新しい方から5件取得しています。
ダッシュボード
<x-app-layout>
<x-slot name="header">
<h2 class="font-semibold text-xl text-gray-800 leading-tight">
{{ __('Dashboard') }}
</h2>
</x-slot>
<div class="py-12">
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
<div class="bg-white overflow-hidden shadow-sm sm:rounded-lg">
<div class="p-6 bg-white border-b border-gray-200">
You're logged in!
</div>
</div>
<div class="bg-white shadow-sm sm:rounded-lg mt-10">
@foreach ($user->posts as $post)
<div class="p-6 border-b border-gray-200 flex items-center justify-between">
<div class="flex flex-col ">
<span class="text-xs text-gray-800">{{ $post->user->name }}</span>
<span class="text-xs text-gray-800">{{ $post->updated_at }}</span>
</div>
<a href="{{ route('posts.show', $post->id) }}">
<p class="text-md">{{$post->title}}</p>
</a>
</div>
@endforeach
</div>
<div class="my-5">{{$user->posts->links()}}</div>
</div>
</div>
</x-app-layout>
17: $users->posts で関連するPost モデルの値を使うことができます。
29: ページネーションを使用