Laravel 5.5 お気に入りボタンが反映しない
- 評価
- クリップ 0
- VIEW 1,687
開発環境 Laravel5.5 PHP MySQL
FavoriteボタンがUnfavariteボタンに切り替わらず、お気に入りページにも追加されません。
Userモデルのfavorite()かunfavorite()がおかしいのかなと考えていますが
なんども見直しましたが原因がわかりません。
//ユーザー機能
Route::group(['middleware' => 'auth'], function(){
Route::resource('users', 'UsersController', ['only' => 'show']);
//レシピ関係
Route::resource('recipes', 'RecipesController');
//お気に入り関係(ユーザー)
Route::group(['prefix' => 'users/{id}'], function(){
Route::get('favorites', 'UsersController@favorites')->name('users.favorites');
});
//お気に入り関係(レシピ)
Route::group(['prefix' => 'recipes/{id}'], function(){
Route::post('favorite', 'FavoritesController@store')->name('favorites.favorite');
Route::delete('unfavorite', 'FavoritesController@destroy')->name('favorites.unfavorite');
});
});
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
public function recipes()
{
return $this->hasMany(Recipe::class);
}
public function favorites()
{
return $this->belongsToMany(Recipe::class, 'user_recipe', 'user_id', 'recipe_id')
->withTimestamps();
}
public function favorite($recipeId)
{
//すでにお気に入りしているか確認
$exist = $this->is_favorite($recipeId);
//相手が自分自身ではないか確認
$its_me = $this->id == $recipeId;
if($exist || $its_me){
//すでにお気に入りしていなければ何もしない
return false;
} else {
//まだお気に入りしてなければお気に入りする
$this->favorites()->attach($recipeId);
return true;
}
}
public function unfavorite($recipeId)
{
//すでにお気に入りしているか確認
$exist = $this->is_favorite($recipeId);
//相手が自分自身ではないか確認
$its_me = $this->id == $recipeId;
if($exist && !$its_me){
//すでにお気に入りしていればお気に入りを外す
$this->favorites()->detach($recipeId);
return true;
} else {
//まだお気に入りしてなければ何もしない
return false;
}
}
public function is_favorite($recipeId)
{
return $this->favorites()->where('recipe_id', $recipeId)->exists();
}
}
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Recipe extends Model
{
protected $fillable = ['user_id', 'name', 'content', 'photo_url'];
public function user()
{
return $this->belongsTo(User::class);
}
public function ingredient()
{
return $this->hasMany(Ingredient::class);
}
public function how_to()
{
return $this->hasMany(HowTo::class);
}
public function favorite_users()
{
return $this->belongsToMany(User::class, 'user_recipe', 'recipe_id', 'user_id')
->withTimestamps();
}
}
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\User;
use App\Micropost;
class UsersController extends Controller
{
public function show($id)
{
$user = User::find($id);
$recipes = $user->recipes()->orderBy('created_at', 'desc')->paginate(10);
$data = [
'user' =>$user,
'recipes' =>$recipes,
];
return view('users.show', $data);
}
public function favorites($id)
{
$user = User::find($id);
$favorites = $user->favorites()->paginate(10);
$data = [
'user' => $user,
'favorites' => $favorites,
];
$data += $this->counts($user);
return view('users.favorites', $data);
}
}
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class FavoritesController extends Controller
{
public function store(Request $request, $id)
{
\Auth::user()->favorite($id);
return back();
}
public function destroy($id)
{
\Auth::user()->unfavorite($id);
return back();
}
}
views/users/favorites.blade.php
@extends('layouts.app')
@section('content')
<div class="row">
<aside class="col-md-4">
<div class="card">
<div class="card-header">
<h3 class="card-title text-center">{{ $user->name }}</h3>
</div>
<div class="card-body">
{!! Form::open(['url' => '/upload', 'method' => 'post', 'files' => true]) !!}
{{--成功メッセージ--}}
@if(session('success'))
<div class="alert alert-success">
{{ session('success') }}
</div>
@endif
<div class="form-group">
@if ($user->avatar_filename)
<p class="text-center">
<img src="{{ asset('storage/avatar/' . $user->avatar_filename) }}" alt="avatar" />
</p>
@endif
{!! Form::label('file', '推奨サイズ200px*200px' , ['class' => 'control-labelse']) !!}
{!! Form::file('file') !!}
</div>
<div class="form-group">
{!! Form::submit('アップロード' , ['class' => 'btn btn-primary']) !!}
</div>
{!! Form::close() !!}
{{--<img class="media-object rounded img-fluid" src="{{ Gravatar::src($user->email, 500) }}" alt="">--}}
</div>
</div>
</aside>
<div class="col-md-8">
<ul class="nav nav-tabs nav-justified mb-3">
<li class="nav-item"><a href="{{ route('users.show', ['id' => $user->id]) }}"
class-"nav-link {{ Request::is('users/' . $user->id) ? 'active' : ''}}">個人レシピ</a></li>
<li class="nav-item"><a href="{{ route('users.favorites', ['id' => $user->id]) }}"
class-"nav-link {{ Request::is('users/*/favorites') ? 'active' : ''}}">お気に入り</a></li>
</ul>
@if (count($favorites) > 0)
@include('recipes.favorites', ['favorites'=> $favorites])
@endif
</div>
</div>
@endsection
views/recipes/favorites.blade.php
<ul class="media-list">
@foreach ($favorites as $favorite)
<li class="media mb-3">
<div class="media-body ml-3">
<div class="row">
<div class="col-4">
<img src="https://placehold.jp/200x200.png"></img>
<h3>{!! link_to_route('recipes.show', $recipe->name, ['id' => $recipe->id]) !!}</h3>
</div>
<div class="col-8">
{!! link_to_route('users.show', $recipe->user->name, ['id' => $recipe->user->id]) !!}
<span class="text-muted">投稿日時 {{ $recipe->created_at }}</span>
<p>{!! nl2br(e($recipe->content)) !!}</p>
@if (Auth::id() == $recipe->user_id)
{!! Form::model($recipe, ['route' => ['recipes.destroy', $recipe->id], 'method' => 'delete']) !!}
{!! Form::submit('削除', ['class' => 'btn btn-danger']) !!}
{!! Form::close() !!}
@endif
@include('favorites.favorite_button', ['recipe' => $recipe])
</div>
</div>
</div>
</li>
@endforeach
</ul>
views/favorites/favorite_button.blade.php
@if (Auth::user()->is_favorite($recipe->id))
{!! Form::open(['route' => ['favorites.unfavorite', $recipe->id], 'method' => 'delete']) !!}
{!! Form::submit('Unfavorite', ['class' => "btn btn-danger btn-block"]) !!}
{!! Form::close() !!}
@else
{!! Form::open(['route' => ['favorites.favorite', $recipe->id]]) !!}
{!! Form::submit('Favorite', ['class' => "btn btn-danger btn-block"]) !!}
{!! Form::close() !!}
@endif
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
まだ回答がついていません
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.22%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる