kawazoesou
@kawazoesou

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

フォロー機能が実装できない

 laravelを用いて簡易的なインスタを作ろうと思っているのですがフォロー機能を実装することができません。
 具体的にはフォローしていないのにボタンの表示がフォロー解除となっています。follow_usersテーブルにidを保存することができていないためだと思うのですが直し方がわかりませんどなたか解決方法を教えていただけると助かります。
 下のURLに参考にさせていただいたサイトを載せておきます。もしお時間ある方がおられましたら教えていただきたいです。よろしくお願いスクリーンショット 2023-11-20 224923.png
します。

やりたいこと
・フォローとフォロー解除
・自分が投降したものはフォローできないようにする

発生している問題・エラー

何が間違えているのか分からない。
フォローを受け取ることができない。

該当するソースコード

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/

0

1Answer

まずは原因の切り分けをしましょう!
・isFollowing()に渡している具体的な値は何か?
・DBの値はどうなっているか?
・isFollowing()に渡している値とDBの値から、フォロー解除と表示されるのは正しい動作か?
上記を確認することで、phpコードが悪いのか、DBの値が悪いのか判断することができると思います。

見たところコードは問題なさそうな気がするので、おそらくDBの値が悪いのでは、と推測しています。
おそらく最初にマイグレーションした段階である程度フォロイー/フォロワー情報が入っているのではないでしょうか?

1Like

Comments

  1. This comment has been deleted for violation of our Terms of Service.
  2. @kawazoesou

    Questioner

    返信遅くなってすみません。回答ありがとうございます。
    isFollowingに渡しているデータはログインしている自分自身のuser_idでした。
    DBの値ですがfollow_userテーブルが空になってました。
    テーブルと値はどのように紐づければよいでしょうか?

    スクリーンショット 2023-12-09 172928.png
    follow_user

    スクリーンショット 2023-12-09 172433.png
    $user->idの値

Your answer might help someone💌