Undefined variable $follower_count エラー表記について
解決したいこと
今課題でインスタグラムの簡易アプリを作っているのですが、フォロー数とフォロワー数を表示させようとしたところエラーが出てしまいますので解決方法を教えてください。
発生している問題・エラー
Undefined variable $follower_count
Views
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row" style="margin: auto;">
<div class="col-3 p-5">
<img src="{{ $user->profile->profileImage() }}" class="rounded-circle w-100">
</div>
<div class="col-9 pt-5">
<div class="d-flex justify-content-between align-items-baseline">
<div class="d-flex align-items-center pb-4">
<div class="h4">{{ $user->username }}</div>
<div class="d-flex justify-content-end flex-grow-1 ps-3">
@if (auth()->user()->isFollowing($user->id))
<form action="{{ route('unfollow', ['user' => $user->id]) }}" method="POST">
{{ csrf_field() }}
{{ method_field('DELETE') }}
<button type="submit" class="btn btn-danger">フォロー解除</button>
</form>
@else
<form action="{{ route('follow', ['user' => $user->id]) }}" method="POST">
{{ csrf_field() }}
@cannot('update', $user->profile)
<button type="submit" class="btn btn-primary">フォローする</button>
</form>
@endif
@endcan
@if (auth()->user()->isFollowed($user->id))
<div class="px-2">
<span class="px-1 bg-secondary text-light">フォローされています</span>
</div>
@endif
</div>
</div>
</div>
@can('update', $user->profile)
<a href="/p/create">投稿</a>
@endcan
@can('update', $user->profile)
<a href="/profile/{{ $user->id}}/edit">プロフィールを編集</a>
@endcan
<div class="d-flex">
<div class="pe-5">投稿<strong>{{ $user->posts->count() }}</strong> 件</div>
<div class="pe-5">フォロワー<strong>{{ $follower_count }}</strong>人</div>
<div class="pe-5">フォロー中<strong>{{ $follow_count }}</strong>人</div>
</div>
<div class="pt-4 font-weight-bold">{{ $user->profile->title }}</div>
<div>{{ $user->profile->description }}</div>
<div><a href="#">{{ $user->profile->url }}</a></div>
</div>
</div>
<div class="row pt-5">
@foreach($user->posts as $post)
<div class="col-4 pb-4">
<a href="/p/{{ $post->id }}">
<img src="/storage/{{ $post->image }}" class="w-100">
</a>
</div>
@endforeach
</div>
</div>
@endsection
Models
<?php
namespace App\Models\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Follower extends Model
{
protected $primaryKey = [
'following_id',
'followed_id'
];
protected $fillable = [
'following_id',
'followed_id'
];
public $timestamps = false;
public $incrementing = false;
public function getFollowCount($user_id)
{
return $this->where('following_id', $user_id)->count();
}
public function getFollowerCount($user_id)
{
return $this->where('followed_id', $user_id)->count();
}
// フォローしているユーザのIDを取得
public function followingIds(Int $user_id)
{
return $this->where('following_id', $user_id)->get('followed_id');
}
}
Models
<?php
namespace App\Models;
// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'name',
'email',
'username',
'password',
];
/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [
'password',
'remember_token',
];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
protected static function boot()
{
parent::boot();
static::created(function ($user){
$user->profile()->create([
'title' => $user->username,
]);
});
}
public function posts()
{
return $this->hasMany(Post::class)->orderBy('created_at', 'DESC');
}
public function profile()
{
return $this->hasOne(\App\Models\Profile::class);
}
public function followers()
{
return $this->belongsToMany(self::class, 'followers', 'followed_id', 'following_id');
}
public function follows()
{
return $this->belongsToMany(self::class, 'followers', 'following_id', 'followed_id');
}
// フォローする
public function follow(Int $user_id)
{
return $this->follows()->attach($user_id);
}
// フォロー解除する
public function unfollow(Int $user_id)
{
return $this->follows()->detach($user_id);
}
// フォローしているか
public function isFollowing(Int $user_id)
{
return $this->follows()->where('followed_id', $user_id)->exists();
}
// フォローされているか
public function isFollowed(Int $user_id)
{
return (boolean) $this->followers()->where('following_id', $user_id)->first(['id']);
}
}
Controller
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
use Intervention\Image\Facades\Image;
use App\Models\Follower;
class ProfilesController extends Controller
{
public function index(User $user)
{
return view('profiles.index', compact('user'));
}
public function edit(User $user)
{
$this->authorize('update', $user->profile);
return view('profiles.edit', compact('user'));
}
public function update(User $user)
{
$data = request()->validate([
'title' => 'required',
'description' => 'required',
'url' => 'url',
'image' => '',
]);
if (request('image')) {
$imagePath = request('image')->store('profile', 'public');
$image = Image::make(public_path("storage/{$imagePath}"))->fit(1000,1000);
$image->save();
$imageArray = ['image' => $imagePath];
}
auth()->user()->profile->update(array_merge(
$data,
$imageArray ?? []
));
return redirect("/profile/{$user->id}");
}
// フォロー
public function follow(User $user)
{
$follower = auth()->user();
// フォローしているか
$is_following = $follower->isFollowing($user->id);
if(!$is_following) {
// フォローしていなければフォローする
$follower->follow($user->id);
return back();
}
}
// フォロー解除
public function unfollow(User $user)
{
$follower = auth()->user();
// フォローしているか
$is_following = $follower->isFollowing($user->id);
if($is_following) {
// フォローしていればフォローを解除する
$follower->unfollow($user->id);
return back();
}
}
public function show(User $user, Follower $follower)
{
$login_user = auth()->user();
$is_following = $login_user->isFollowing($user->id);
$is_followed = $login_user->isFollowed($user->id);
$follow_count = $follower->getFollowCount($user->id);
$follower_count = $follower->getFollowerCount($user->id);
return view('users.show', [
'user' => $user,
'is_following' => $is_following,
'is_followed' => $is_followed,
'follow_count' => $follow_count,
'follower_count' => $follower_count
]);
}
}
自分で試したこと
Viewのフォロー数を{{ Auth::user()->follows()->count() }}とフォロワー数を{{ Auth::user()->followers()->count() }}
に変更したところエラーは改善しましたが、ログインしているユーザーのフォロー数とフォロワー数がすべて他のユーザーのページで反映してしまうため、他のユーザーのページでもきちんと反映できるように変更したいです。
初心者でわからないことだらけなので教えていただきたいです。
※追記 Routes
<?php
use Illuminate\Support\Facades\Route;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Auth::routes();
// フォロー/フォロー解除を追加
Route::post('/profile/{user}/follow', 'App\Http\Controllers\ProfilesController@follow')->name('follow');
Route::delete('/profile/{user}/unfollow', 'App\Http\Controllers\ProfilesController@unfollow')->name('unfollow');
Route::get('/p/create','App\Http\Controllers\PostsController@create');
Route::get('/p/{post}','App\Http\Controllers\PostsController@show');
Route::post('/p','App\Http\Controllers\PostsController@store');
Route::get('/profile/{user}', 'App\Http\Controllers\ProfilesController@index')->name('profile.show');
Route::get('/profile/{user}/edit', 'App\Http\Controllers\ProfilesController@edit')->name('profile.edit');
Route::patch('/profile/{user}', 'App\Http\Controllers\ProfilesController@update')->name('profile.update');
Auth::routes();
Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
Route::get('/', 'App\Http\Controllers\PostsController@index')->name('posts.index');
Route::post('/like/{postId}',[App\Http\Controllers\LikeController::class,'store']);
Route::post('/unlike/{postId}',[App\Http\Controllers\LikeController::class,'destroy']);