こんにちは。プログラミング初心者で、お気に入り機能の実装を進めています。
やりたいことは、
①ログインしていないユーザーが登録した物をお気に入り追加できお気に入りを解除できる。
②右上につけた♡ボタンを押すとお気に入り登録したもの見れる
初心者でわからないことばかりなのですが、やりながら覚えたいと考えております。
教えていただけると幸いです。
現在お気に入り機能で実装追加した部分を載せます。
お気に入りテーブル
public function up() { Schema::create('favorites', function (Blueprint $table) { $table->increments('id'); $table->integer('user_id')->unsigned(); $table->integer('article_id')->unsigned(); $table->timestamps(); $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); //外部キー参照 $table->foreign('article_id')->references('id')->on('articles')->onDelete('cascade'); //外部キー参照 $table->unique(['user_id','article_id'],'uq_roles');//laravelは複合主キーが扱いにくいのでユニークで代用 }); } public function down() { Schema::dropIfExists('favorites'); } }
FavoritesController
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class FavoritesController extends Controller { public function store(Request $request, $id) { user()->favorite($id); return back(); } public function destroy($id) { user()->unfavorite($id); return back(); } }
UsersController
public function favorite_index($id) { $data = []; $user = User::find($id); $favorite = $user->favorites()->orderBy('created_at', 'desc')->paginate(10); $articles = $user->favorites()->orderBy('created_at', 'desc')->paginate(10); $data = [ 'user' => $user, 'articles' => $articles, ]; $data += $this->counts($user); return view('users.favorites', $data); } public function favorite_store(request $request) { $this->validate($request,[ 'article' => 'required|max:10', 'content' => 'required|max:191', ]); $favorite = new Favorite; $favorite ->user_id = user()->id; $favorite ->article_id =$request->article_id; $favorite ->save(); return redirect('/'); } public function destroy($id) { $article = \App\Article::find($id); if(id() ===$article->user_id){ $article->delete(); } return redirect('/'); } public function favorite($id) { $user = User::find($id); $exist = $this->is_favorite($articleId); $favorites = $user->favorites()->paginate(6); $articles = $user->favorites()->paginate(6); $data = [ 'user' => $user, 'users' => $favorites, ]; $data += $this->counts($user); return view('users.favorites', $data); } public function unfavorite($id) { $user = User::find($id); $exist = $this->is_favorite($articleId); $unfavorites = $user->unfavorites()->paginate(6); $data = [ 'user' => $user, 'users' => $unfavorites, ]; $data += $this->counts($user); return view('users.unfavorites', $data); } }
User.php
class User extends Authenticatable { use Notifiable; protected $fillable = [ 'name', 'email', 'password', ]; protected $hidden = [ 'password', 'remember_token', ]; public function articles() { return $this->hasMany(Article::class); } public function favorites() { return $this->belongsToMany(Article::class, 'favorites', 'user_id', 'article_id')->withTimestamps(); } public function favorite($articleId) { // 既に登録しているかの確認 $exist = $this->is_favorite($articleId); if ($exist) { // 既に登録していれば何もしない return true; } else { // 未登録であれば登録する $this->favorites()->attach($articleId); return false; } } public function unfavorite($articleId) { // 既に登録しているのか確認 $exist = $this->is_favorite($articleId); if ($exist) { $this->favorites()->detach($aricleId); // 既に登録していればフォローを外す return true; } else { // 未フォローであれば何もしない return false; } } public function is_favorite($articleId) { return $this->favorites()->where('article_id', $articleId)->exists(); } }
web.php
//お気に入り機能 Route::group(['prefix' => 'articles/{id}'], function () { Route::post('favorite', 'FavoritesController@store')->name('user.favorite'); Route::delete('unfavorite', 'FavoritesController@destroy')->name('user.unfavorite'); });
エラー部分。下記favorite用のボタンです。
favorite_button.blade.php
@if (user()->is_favorite($article->id)) {!! Form::open(['route' => ['user.unfavorite', $article->id], 'method' => 'delete']) !!} {!! Form::submit('Unfavorite', ['class' => "btn btn-danger btn-block btn-sm col-sm-5"]) !!} {!! Form::close() !!} @else {!! Form::open(['route' => ['user.favorite', $article->id]]) !!} {!! Form::submit('favorite', ['class' => "btn btn-primary btn-block btn-sm col-sm-5"]) !!} {!! Form::close() !!} @endif
上記実装の下記のぶぶんです。
@if (user()->is_favorite($article->id))
長くなってしまいましたがコメントよろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。