Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

いいね状態 と 非いいね状態 の表示制御がうまくいきません。

解決したいこと

いいね状態 と 非いいね状態 の表示制御がうまくいってないので解決したい。

laravelでツイッターのようなアプリをつくっています。
https://qiita.com/phper_sugiyama/items/9a4088d1ca816a7e3f29 
上記の記事を参考にいいね機能を作成しているのですが、「いいね」を押しても、ボタンの色が変わらず、無限にいいねを押し続けてしまっています。
理想としては、一度「いいね」を押したら、ボタンの色が緑色に変化し、もう一度押すと、いいねが取り消されて、元のグレーにボタンの色が戻る仕様にすることです。

blade.php

$likeは参考記事では $reply->is_liked_by_auth_user() となっており、コントローラーでインスタンス化してblade.phpに$likeという形で渡しています。

@if( $like )
    <a href="{{ route('unlike', ['id' => $record->id]) }}" class="btn btn-danger opacity-75 btn-sm">
    <i class="fa fa-heart" aria-hidden="true"></i>    
    <span class="badge">済</span></a>
@else
    <a href="{{ route('like', ['id' => $record->id]) }}" class="btn btn-secondary btn-sm">
    <i class="fa fa-heart" aria-hidden="true"></i>
    <span class="badge">未</span></a>
@endif

以下、Recordモデルです。(記事中ではReplyモデルとなっています。)

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Models\Like;



class Record extends Model
{
    use HasFactory;

    public function user() {
        return $this->belongsTo('App\Models\User');
    }

    public function likes()
    {
      return $this->hasMany(Like::class, 'record_id');
    }

    /**
     * リプライにLIKEを付いているかの判定
     * 
     *  @return bool true:Likeがついてる false:Likeがついてない
    */

    public function is_liked_by_auth_user()
  {
    $id = \Auth::id();

    $likers = array();
    foreach($this->likes as $like) {
        //array_pushは配列に値を追加する。第一引数に追加する配列、第二引数に追加する値
      array_push($likers, $like->user_id);
    }
    
    //in_array 第一引数に検索する値、第二引数に配列
    if (in_array($id, $likers)) {
      return true;
    } else {
      return false;
    }

  }
  
}

以下、実装中のいいねボタンです。

いいね.png

ボタンを押すとDBに登録されます。

+----+-----------+---------+---------------------+---------------------+
| id | record_id | user_id | created_at          | updated_at          |
+----+-----------+---------+---------------------+---------------------+
| 38 |         6 |       3 | 2022-03-13 16:09:44 | 2022-03-13 16:09:44 |
+----+-----------+---------+---------------------+---------------------+

しかし、if文内の判定がうまくされないのか、bladeが切り替わらず、無限いいねをしてしまいます。

自分で試したこと

Recordモデルのif文の判定がうまくできていないのではと思い、いろいろいじってみたのですが、解決しませんでした。
また、キャッシュの削除もしてみましたが、解決しませんでした。

何か助言をいただけると幸いです。よろしくお願いいたします。

0

1Answer

どこが正しく動いていて、どこが正しく動いていないのかを丁寧に探していくしかないです。

  • blade.phpの$likeが想定通りなら、ボタンの切り替えは正しく動作するのか?
  • blade.phpの$linkに想定通りの値が入っているのか?(コントローラーから値が正しく渡せているか)
  • is_liked_by_auth_userメソッドの結果は想定通りか?
0Like

Comments

  1. @m1527092

    Questioner

    コメントありがとうございます。

    現在確認したところ、
    ❶ボタンの切り替えは正しく動作します。
      (意図的にbladeのif()をtrueとfalseを反転した時に、色も反転します。)

    ❷$linkに想定通りの値が入っておりませんでした。
    Recordモデルの中で、dd($likers)をしたところ、配列に値が入りませんでした。
       配列が空のままなので、$likeは常にfalseとなってしまっているようです。

    十中八九、ここが問題だと思うのですが、
    $likers = array();
    foreach($this->likes as $like) {
    array_push($likers, $like->user_id);
    }

    ここのデータの管理がうまくいってない感じですよね、たぶん…。

    少し考えてみます。。。

Your answer might help someone💌