「いいね!」ボタンを押すと、「いいね!を外す」ボタンに切り替わる様にしたいのですが・・・
PHP/Laravelでオリジナルサービスを制作中で、上手く行かない部分があり、
分かる方がおられましたら、是非お力をお借りしたいです。。。
下記の写真のように、各コンテンツ(この場合は各動画)の下に「いいね!」ボタンを設けており、
「いいね!」ボタン(緑色)を押すと、「いいね!を外す」ボタン(黄色)に切り替わる仕様にしているはずなのですが
なぜか上手く切り替わる場合と、そうでない場合があり、困っています。
######この画像は、すべての「いいね!を付ける」ボタンを押した後の写真です。しかし、なぜかボタンが切り替わるものと、そうでないものがあります。
該当のソースコード
users(ユーザー)テーブルと、movies(動画)テーブルがあり、その間に中間テーブルとして
favorites(いいね)テーブルを設けることで、ユーザーがどの動画にいいね!したかどうかを保存しています。
######User.php ユーザーモデル 一部抜粋
PHP
1 2class User extends Authenticatable 3{ 4 use Notifiable; 5 use SoftDeletes; 6 7 8 public function favorites(){ 9 return $this->belongsToMany(User::class, 'favorites', 'user_id', 'movie_id')->withTimestamps(); 10 } 11 12 public function favorite($movieId) 13 { 14 $exist = $this->is_favorite($movieId); 15 16 if($exist){ 17 return false; 18 }else{ 19 $this->favorites()->attach($movieId); 20 return true; 21 } 22 } 23 24 public function unfavorite($movieId) 25 { 26 $exist = $this->is_favorite($movieId); 27 28 if($exist){ 29 $this->favorites()->detach($movieId); 30 return true; 31 }else{ 32 return false; 33 } 34 } 35 36 public function is_favorite($movieId) 37 { 38 return $this->favorites()->where('movie_id',$movieId)->exists(); 39 } 40
######FavoriteController.php 一部抜粋
PHP
1 2 class FavoriteController extends Controller 3{ 4 public function store(Request $request, $id) 5 { 6 \Auth::user()->favorite($id); 7 return back(); 8 } 9 10 public function destroy($id) 11 { 12 \Auth::user()->unfavorite($id); 13 return back(); 14 } 15} 16
そして、下記のviewにて、「いいね!を付ける」場合と、「いいね!を外す」場合に、
条件分岐させているはずなのですが、これが上手く表示されず、
一度「いいね!」ボタンを押した後も、ボタンの表示が切り替わらない場合があります。
######favorite.button.blade.php 一部抜粋
PHP
1 2 @if (Auth::user()->is_favorite($movie->id)) 3 4 {!! Form::open(['route' => ['favorites.unfavorite', $movie->id], 'method' => 'delete']) !!} 5 {!! Form::submit('いいね!を外す', ['class' => "button btn btn-warning"]) !!} 6 {!! Form::close() !!} 7 8 @else 9 10 {!! Form::open(['route' => ['favorites.favorite', $movie->id]]) !!} 11 {!! Form::submit('いいね!を付ける', ['class' => "button btn btn-success"]) !!} 12 {!! Form::close() !!} 13 14 @endif 15
試したこと
ボタンが切り替わらない場合、ボタンを押してもMySQLに「いいね!したこと」が保存されていないのでは?
と思い、データベースを確認してみると、MySQLには全てのボタンを押した「いいね」のレコードがきちんと存在しました。
また、ボタンが切り替わらなかった場合に、もう一度、「いいね!を付ける」を押してみると
下記のエラーが発生しました。
######エラーコード 「いいね!を付ける」ボタンを2回連続して押した場合
PHP
1SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1-8' for key 'favorites_user_id_movie_id_unique' (SQL: insert into `favorites` (`created_at`, `movie_id`, `updated_at`, `user_id`) values
「制約のため、重複してSQLに保存できません」のようなエラーだと思いますので、
このエラーよりも、ボタンが切り替わらないことの方が問題だと考えました。
ただ、気になるのは、一番上の画像の通り、
「いいねボタンが切り替わる場合と、切り替わらない場合がある」ということです。
どなたか、お分かりの方がおられましたら、お教え頂けましたら大変嬉しいです。
宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー