はじめに
サービスの概要としては、本のデータがあって、user機能があって、userは本にブックマーク(お気に入り機能)をつけることができるという感じです。
##実装
Book.php
public function bookMarks(){
return $this->hasMany('App\BookMark');
}
User.php
public function bookmarks(){
return $this->hasMany('App\BookMark');
}
BookMark.php
public function book(){
return $this->belongsTo('App\Book');
}
public function user(){
return $this->belongsTo('App\User');
}
関連はこのような感じになってます!
@if (Auth::check())
@if ($bookmark)
<form action="{{action('BookMarksController@destroy',$book->id)}}" method="POST" class="mb-4" >
<input type="hidden" name="book_id" value="{{$book->id}}">
@csrf
@method('DELETE')
<button type="submit">
ブックマーク解除
</button>
</form>
@else
<form action="{{action('BookMarksController@store')}}" method="POST" class="mb-4" >
@csrf
<input type="hidden" name="book_id" value="{{$book->id}}">
<button type="submit">
ブックマーク
</button>
</form>
@endif
@endif
これは本の詳細ページなのですが、ブックマークしてたら「ブックマーク解除」ボタンが表示され、していなかったら「ブックマーク」ボタンが表示されるようにif文をかけてます。
BookMarksController
<?php
namespace App\Http\Controllers;
use App\BookMark;
use App\Book;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
class BookMarksController extends Controller
{
public function store(Request $request)
{
$bookmark = new BookMark;
$bookmark->book_id = $request->book_id;
$bookmark->user_id = Auth::user()->id;
$bookmark->save();
return redirect()->route('book.show',[$request->book_id]);
}
public function destroy(Request $request, $id) {
$book=Book::findOrFail($id);
$book->bookmarks()->delete();
return redirect()->route('book.show',[$request->book_id]);
}
}
次にコントローラーです。storeはシンプルにリクエストで渡ってきた値を代入しているだけですね。 destroyの方はまず本のデータを取ってきて、紐付いているブックマークを削除という形です。destroyの方はもっと良い書き方がありそうですが。。。