はじめに
いいね機能をJavascriptを使わずに実装したい(jsやったことないから逃げたい)ので自分で考えて実装してみました。絶対にもっと効率のいい方法あるので教えてほしい。
※Laravel 6.0
設計
・いいねしている時はいいね削除ボタン、いいねしていないときにはいいねボタンを表示する。
・ユーザがログインしている時のみいいねボタンを表示する。(今回は割愛)
・php(Laravel)のみを用いて実装
プログラム(コントローラ)
FavoriteController.php(一部)
public function favorite(Request $request){
$twe_id = $request->twe_id;
$name = DB::table('post')->where('twe_id', $twe_id)->first();
$names = $name->user_id;
$user = Auth::user();
$favname = $user['name'];
$judge = DB::select('select * from favorite where twe_id = ? and fav_name = ?', [$twe_id, $favname]);
if(!$judge){
DB::insert('insert into favorite (twe_id, fav_name, name) values (?,?,?)',[$twe_id,$favname,$names]);
}else{
DB::delete('delete from favorite where twe_id = ? and fav_name = ?',[$twe_id,$favname]);
}
return redirect()->back()->withInput();
}
プログラム(ビュー)
Home.blade.php(一部)
@php
$count = 0;
@endphp
@if(Auth::check())
<form action="{{ url('/fav/' . $d->twe_id) }}" method="POST">
{{ csrf_field() }}
@foreach($judge as $j)
@if($j->twe_id == $d->twe_id)
@php
$count = 1;
@endphp
@else
@php
$count = $count;
@endphp
@endif
@endforeach
@if($count == 1)
<button class="btn btn-warning" style="float: right;">unlike
@else
<button class="btn btn-success" style="float: right;">Like
@endif
解説
DBの設計などを省略しているため、概要のみの解説。
まず、ビュー側のいいねボタン(いいね取り消しボタン)をクリックした時、いいねしたい投稿のidをPOST送信する。そしてコントローラでリクエストを受け取り、$twe_idに格納する。次に、$userにAuth::user()でログイン中のユーザ情報つまりいいねするユーザ情報を格納する。そして$fav_nameにそのユーザのidのみ格納する。
次にそのユーザがその投稿に既にいいねしているか否かでいいねテーブルに格納するか削除するかを判断しなくてはならない。$judgeという変数にいいねテーブルからそのユーザかつその投稿idのデータをselect文で抽出し、存在しないならば新しくいいねテーブルに追加、存在するならばそのデータを削除する。そして元いたページにリダイレクトする。
つぎにフロント側の解説をする。いいね済か否かを判断する変数$countを用意する。$d->twe_idが現在表示している投稿のid、$j->twe_idには現在ログイン中のユーザがいいねしている投稿のidが格納されている。つまりこの2つが一致した時にいいねしているということなのでいいね取り消しボタン、そうでないときにいいねボタンを表示する。ここで直接ボタン表示をif文の中に入れると処理をfor文でまわしているため何個もボタンが表示されてしまう。ゆえに変数$countを用意した。
おわり。
もしよければ↓ぽちっと↓お願いします。