フォロー機能が実装できない
laravelを用いて簡易的なインスタを作ろうと思っているのですがフォロー機能を実装することができません。
具体的にはフォローしていないのにボタンの表示がフォロー解除となっています。follow_usersテーブルにidを保存することができていないためだと思うのですが直し方がわかりませんどなたか解決方法を教えていただけると助かります。
下のURLに参考にさせていただいたサイトを載せておきます。もしお時間ある方がおられましたら教えていただきたいです。よろしくお願い
します。
やりたいこと
・フォローとフォロー解除
・自分が投降したものはフォローできないようにする
発生している問題・エラー
何が間違えているのか分からない。
フォローを受け取ることができない。
該当するソースコード
follow_usersテーブル
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('follow_users', function (Blueprint $table) {
// $table->id();
/*フォローされているユーザー*/
$table->foreignId('followed_user_id')->constrained('users')->cascadeOnDelete();
/*フォローしているユーザー*/
$table->foreignId('following_user_id')->constrained('users')->cascadeOnDelete();
// $table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('follow_users');
}
};
show.bladeファイル
<!DOCTYPE HTML>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Posts</title>
<!-- Fonts -->
<link href="https://fonts.googleapis.com/css?family=Nunito:200,600" rel="stylesheet">
</head>
<body>
<div class="edit"><a href="/posts/{{ $post->id }}/edit">edit</a></div>
<div>
@if($post->is_liked_by_auth_user())
<a href="/posts/unlike/{{ $post->id }}" class="btn btn-success btn-sm">いいね解除<span class="badge">{{ $post->likes->count() }}</span></a>
@else
<a href="/posts/like/{{ $post->id }}" class="btn btn-secondary btn-sm">いいね<span class="badge">{{ $post->likes->count() }}</span></a>
@endif
</div>
<div class="d-flex justify-content-end flex-grow-1">
@if(Auth::id() != $user_flg)
@if(Auth::user()->isFollowing($user->id))
<form action="{{ route('unfollow', ['user' => $user->id]) }}" method="POST">
@csrf
{{ method_field('DELETE') }}
<button type="submit" class="btn btn-danger">フォロー解除</button>
</form>
@else
<form action="{{ route('follow', ['user' => $user->id]) }}" method="POST">
@csrf
<button type="submit" class="btn btn-primary">フォロー</button>
</form>
@endif
@endif
</div>
<h1 class="title">
{{ $post->title }}
</h1>
<div class="content">
<div class="content__post">
<h3>本文</h3>
<p>{{ $post->body }}</p>
</div>
@if($post->move_url)
<div>
<video autoplay playsinline controls src="{{ $post->move_url }}" width="190",height="190" alt="画像が読み込めない。"></video>
</div>
@endif
</div>
<div class="footer">
<a href="/">戻る</a>
</div>
</body>
</html>
Follow.phpファイル
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Follower extends Model
{
protected $primaryKey = [
'following_user_id',
'followed_user_id'
];
protected $fillable = [
'following_user_id',
'followed_user_id'
];
protected $table = 'follow_users';
public $timestamps = false;
public $incrementing = false;
}
User.phpファイル
<?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;
use App\Models\Follow;
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'name',
'email',
'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',
];
public function followers()
{
return $this->belongsToMany(User::class, 'follow_users', 'followed_user_id', 'following_user_id');
}
public function follows()
{
return $this->belongsToMany(User::class, 'follow_users', 'following_user_id', 'followed_user_id');
}
//フォローする
public function follow($user_id)
{
return $this->follows()->attach($user_id);
}
// フォロー解除する
public function unfollow($user_id)
{
return $this->follows()->detach($user_id);
}
// フォローしているか
public function isFollowing($user_id)
{
return (boolean) $this->follows()->where('followed_user_id', $user_id);
}
// フォローされているか
public function isFollowed($user_id)
{
return (boolean) $this->followers()->where('following_user_id', $user_id);
}
}
web.phpファイル
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\PostController;
use App\Http\Controllers\ProfileController;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "web" middleware group. Make something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Route::get('/dashboard', function () {
return view('dashboard');
})->middleware(['auth', 'verified'])->name('dashboard');
Route::middleware('auth')->group(function () {
Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit');
Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update');
Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy');
});
Route::get('/', [PostController::class, 'index']);
Route::get('/posts/create', [PostController::class ,'create']);
Route::post('/posts', [PostController::class, 'store']);
Route::get('/posts/{post}',[PostController::class ,'show']);
Route::get('/posts/{post}/edit', [PostController::class, 'edit']);
Route::put('/posts/{post}', [PostController::class, 'update']);
Route::get('/posts/like/{id}',[PostController::class, 'like']);
Route::get('/posts/unlike/{id}',[PostController::class, 'unlike']);
Route::post('posts/{user}/follow', [PostController::class, 'follow'])->name('follow');
Route::delete('posts/{user}/unfollow', [PostController::class, 'unfollow'])->name('unfollow');
require __DIR__.'/auth.php';
自分で試したこと
いろんなサイトを見て回り試した挙句、何をしてるのか分からなくなりました。
主に参考にしたもの
https://nao-blog.info/laravel-follow/