質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.22%

Laravel 5.5 お気に入りボタンが反映しない

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,687

Ryosukevvvv

score 19

開発環境 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%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る