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

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

新規登録して質問してみよう
ただいま回答率
85.49%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

0回答

1112閲覧

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

Ryosukevvvv

総合スコア19

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2018/12/30 10:28

編集2018/12/30 10:32

開発環境 Laravel5.5 PHP MySQL

FavoriteボタンがUnfavariteボタンに切り替わらず、お気に入りページにも追加されません。
Userモデルのfavorite()かunfavorite()がおかしいのかなと考えていますが
なんども見直しましたが原因がわかりません。

web

1//ユーザー機能 2Route::group(['middleware' => 'auth'], function(){ 3 Route::resource('users', 'UsersController', ['only' => 'show']); 4 5 //レシピ関係 6 Route::resource('recipes', 'RecipesController'); 7 8 //お気に入り関係(ユーザー) 9 Route::group(['prefix' => 'users/{id}'], function(){ 10 Route::get('favorites', 'UsersController@favorites')->name('users.favorites'); 11 }); 12 //お気に入り関係(レシピ) 13 Route::group(['prefix' => 'recipes/{id}'], function(){ 14 Route::post('favorite', 'FavoritesController@store')->name('favorites.favorite'); 15 Route::delete('unfavorite', 'FavoritesController@destroy')->name('favorites.unfavorite'); 16 }); 17 18});

User

1namespace App; 2 3use Illuminate\Notifications\Notifiable; 4use Illuminate\Foundation\Auth\User as Authenticatable; 5 6class User extends Authenticatable 7{ 8 use Notifiable; 9 10 /** 11 * The attributes that are mass assignable. 12 * 13 * @var array 14 */ 15 protected $fillable = [ 16 'name', 'email', 'password', 17 ]; 18 19 /** 20 * The attributes that should be hidden for arrays. 21 * 22 * @var array 23 */ 24 protected $hidden = [ 25 'password', 'remember_token', 26 ]; 27 28 public function recipes() 29 { 30 return $this->hasMany(Recipe::class); 31 } 32 33 public function favorites() 34 { 35 return $this->belongsToMany(Recipe::class, 'user_recipe', 'user_id', 'recipe_id') 36 ->withTimestamps(); 37 } 38 39 public function favorite($recipeId) 40 { 41 //すでにお気に入りしているか確認 42 $exist = $this->is_favorite($recipeId); 43 //相手が自分自身ではないか確認 44 $its_me = $this->id == $recipeId; 45 46 if($exist || $its_me){ 47 //すでにお気に入りしていなければ何もしない 48 return false; 49 } else { 50 //まだお気に入りしてなければお気に入りする 51 $this->favorites()->attach($recipeId); 52 return true; 53 } 54 } 55 56 public function unfavorite($recipeId) 57 { 58 //すでにお気に入りしているか確認 59 $exist = $this->is_favorite($recipeId); 60 //相手が自分自身ではないか確認 61 $its_me = $this->id == $recipeId; 62 63 if($exist && !$its_me){ 64 //すでにお気に入りしていればお気に入りを外す 65 $this->favorites()->detach($recipeId); 66 return true; 67 } else { 68 //まだお気に入りしてなければ何もしない 69 return false; 70 } 71 } 72 73 public function is_favorite($recipeId) 74 { 75 return $this->favorites()->where('recipe_id', $recipeId)->exists(); 76 } 77}

Recipe

1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6 7class Recipe extends Model 8{ 9 protected $fillable = ['user_id', 'name', 'content', 'photo_url']; 10 11 public function user() 12 { 13 return $this->belongsTo(User::class); 14 } 15 16 public function ingredient() 17 { 18 return $this->hasMany(Ingredient::class); 19 } 20 21 public function how_to() 22 { 23 return $this->hasMany(HowTo::class); 24 } 25 26 public function favorite_users() 27 { 28 return $this->belongsToMany(User::class, 'user_recipe', 'recipe_id', 'user_id') 29 ->withTimestamps(); 30 } 31}

UsersController

1namespace App\Http\Controllers; 2 3use Illuminate\Http\Request; 4 5use App\User; 6use App\Micropost; 7 8class UsersController extends Controller 9{ 10 public function show($id) 11 { 12 $user = User::find($id); 13 $recipes = $user->recipes()->orderBy('created_at', 'desc')->paginate(10); 14 15 $data = [ 16 'user' =>$user, 17 'recipes' =>$recipes, 18 ]; 19 20 return view('users.show', $data); 21 } 22 23 public function favorites($id) 24 { 25 $user = User::find($id); 26 $favorites = $user->favorites()->paginate(10); 27 28 $data = [ 29 'user' => $user, 30 'favorites' => $favorites, 31 ]; 32 33 $data += $this->counts($user); 34 35 return view('users.favorites', $data); 36 } 37}

FavoritesController

1namespace App\Http\Controllers; 2 3use Illuminate\Http\Request; 4 5class FavoritesController extends Controller 6{ 7 public function store(Request $request, $id) 8 { 9 \Auth::user()->favorite($id); 10 return back(); 11 } 12 13 public function destroy($id) 14 { 15 \Auth::user()->unfavorite($id); 16 return back(); 17 } 18}

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問