Laravelにてツイッターの模擬サイトをつくろうとしています。
その中でお気に入り機能を追加したいのですが、うまくいかないのでご教授いただきたいです。
具体的な内容は下記の通りです。
やりたいこととしては
1.User.phpでfeed_favoriteMicroposts()を定義。
2.MicropostsControllerのfavoriteIndex()を用いて変数をnavtabs.blade.phpへ
3.navtabs.blade.php⇨favorites.blade.php⇨favoriteUsers.blade.phpへ
・エラーの内容
https://gyazo.com/6292d8f44bdfec46436a7cee584b01a5
・MicropostsController
PHP
1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6 7class MicropostsController extends Controller 8{ 9 〜省略〜 10 11 public function favorite_users() 12 { 13 // 第一引数:得られるmodelクラス、第二引数:中間テーブル、第三引数:自分のidを示すカラム、第四引数:相手のidを示すカラム 14 return $this->belongsToMany(User::class, 'favorite', 'micropost_id', 'user_id' )->withTimestamps(); 15 } 16 17 public function favoriteIndex() 18 { 19 $data = []; 20 if (\Auth::check()) { // 認証済みの場合 21 // 認証済みユーザを取得 22 $user = \Auth::user(); 23 // お気に入り投稿の一覧を作成日時の降順で取得 24 $favoritePosts = $user->feed_favoriteMicroposts()->orderBy('created_at', 'desc')->paginate(10); 25 26 $data = [ 27 'user' => $user, 28 'favoritePosts' => $favoritePosts, 29 ]; 30 } 31 32 // Welcomeビューでそれらを表示 33 return view('users.navtabs', $data); 34 } 35 36 37} 38
・User.php
PHP
1<?php 2 3<?php 4 5namespace App; 6 7use Illuminate\Contracts\Auth\MustVerifyEmail; 8use Illuminate\Foundation\Auth\User as Authenticatable; 9use Illuminate\Notifications\Notifiable; 10 11class User extends Authenticatable 12{ 13 use Notifiable; 14 15 /** 16 * The attributes that are mass assignable. 17 * 18 * @var array 19 */ 20 protected $fillable = [ 21 'name', 'email', 'password', 22 ]; 23 24 /** 25 * The attributes that should be hidden for arrays. 26 * 27 * @var array 28 */ 29 protected $hidden = [ 30 'password', 'remember_token', 31 ]; 32 33 /** 34 * The attributes that should be cast to native types. 35 * 36 * @var array 37 */ 38 protected $casts = [ 39 'email_verified_at' => 'datetime', 40 ]; 41 42 /** 43 * このユーザが所有する投稿。( Micropostモデルとの関係を定義) 44 */ 45 public function microposts() 46 { 47 return $this->hasMany(Micropost::class); 48 } 49 50 /** 51 * このユーザに関係するモデルの件数をロードする。 52 */ 53 public function loadRelationshipCounts() 54 { 55 $this->loadCount(['microposts', 'followings', 'followers','favorites']); 56 } 57 58 59 /** 60 * このユーザがフォロー中のユーザ。( Userモデルとの関係を定義) 61 */ 62 public function followings() 63 { 64 return $this->belongsToMany(User::class, 'user_follow', 'user_id', 'follow_id')->withTimestamps(); 65 } 66 67 /** 68 * このユーザをフォロー中のユーザ。( Userモデルとの関係を定義) 69 */ 70 public function followers() 71 { 72 return $this->belongsToMany(User::class, 'user_follow', 'follow_id', 'user_id')->withTimestamps(); 73 } 74 75 /** 76 * $userIdで指定されたユーザをフォローする。 77 * 78 * @param int $userId 79 * @return bool 80 */ 81 public function follow($userId) 82 { 83 // すでにフォローしているかの確認 84 $exist = $this->is_following($userId); 85 // 相手が自分自身かどうかの確認 86 $its_me = $this->id == $userId; 87 88 if ($exist || $its_me) { 89 // すでにフォローしていれば何もしない 90 return false; 91 } else { 92 // 未フォローであればフォローする 93 $this->followings()->attach($userId); 94 return true; 95 } 96 } 97 98 /** 99 * $userIdで指定されたユーザをアンフォローする。 100 * 101 * @param int $userId 102 * @return bool 103 */ 104 public function unfollow($userId) 105 { 106 // すでにフォローしているかの確認 107 $exist = $this->is_following($userId); 108 // 相手が自分自身かどうかの確認 109 $its_me = $this->id == $userId; 110 111 if ($exist && !$its_me) { 112 // すでにフォローしていればフォローを外す 113 $this->followings()->detach($userId); 114 return true; 115 } else { 116 // 未フォローであれば何もしない 117 return false; 118 } 119 } 120 121 /** 122 * 指定された $userIdのユーザをこのユーザがフォロー中であるか調べる。フォロー中ならtrueを返す。 123 * 124 * @param int $userId 125 * @return bool 126 */ 127 public function is_following($userId) 128 { 129 // フォロー中ユーザの中に $userIdのものが存在するか 130 return $this->followings()->where('follow_id', $userId)->exists(); 131 } 132 133 public function feed_microposts() 134 { 135 // このユーザがフォロー中のユーザのidを取得して配列にする 136 $userIds = $this->followings()->pluck('users.id')->toArray(); 137 // このユーザのidもその配列に追加 138 $userIds[] = $this->id; 139 // それらのユーザが所有する投稿に絞り込む 140 return Micropost::whereIn('user_id', $userIds); 141 } 142 143 /** 144 * このユーザがお気に入りの投稿。( Userモデルとの関係を定義) 145 */ 146 public function favorites() 147 { 148 // 第一引数:得られるmodelクラス、第二引数:中間テーブル、第三引数:自分のidを示すカラム、第四引数:相手のidを示すカラム 149 return $this->belongsToMany(Micropost::class, 'favorite', 'user_id', 'micropost_id')->withTimestamps(); 150 } 151 152 public function favorite($userId) 153 { 154 // すでにフォローしているかの確認 155 $exist = $this->is_favorite($userId); 156 // 相手が自分自身かどうかの確認 157 $its_me = $this->id == $userId; 158 159 if ($exist || $its_me) { 160 // すでにフォローしていれば何もしない 161 return false; 162 } else { 163 // 未フォローであればフォローする 164 $this->favorites()->attach($userId); 165 return true; 166 } 167 } 168 169 public function unfavorite($userId) 170 { 171 // すでにフォローしているかの確認 172 $exist = $this->is_favorite($userId); 173 // 相手が自分自身かどうかの確認 174 $its_me = $this->id == $userId; 175 176 if ($exist && !$its_me) { 177 // すでにフォローしていればフォローを外す 178 $this->favorites()->detach($userId); 179 return true; 180 } else { 181 // 未フォローであれば何もしない 182 return false; 183 } 184 } 185 186 public function is_favorite($userId) 187 { 188 // フォロー中ユーザの中に $userIdのものが存在するか 189 return $this->favorites()->where('micropost_id', $userId)->exists(); 190 } 191 192 public function feed_favoriteMicroposts() 193 { 194 // favoriteテーブに記録されているuser_idを取得 195 $userIds = $this->favorites()->pluck('favorite.user_id')->toArray(); 196 // Micropostテーブルのデータのうち、$userIDs配列のいずれかと合致するuser_idをもつものを返す。 197 return Micropost::whereIn('user_id', $userIds); 198 // favoriteテーブに記録されているmicropost_idを取得 199 $postIds = $this->favorites()->pluck('favorite.micropost_id')->toArray(); 200 // Micropostテーブルのデータのうち、$postIds配列のいずれかと合致するidをもつものを返す。 201 return Micropost::whereIn('id', $postIds); 202 } 203} 204
・navtabs.blade
PHP
1<ul class="nav nav-tabs nav-justified mb-3"> 2 {{-- ユーザ詳細タブ --}} 3 <li class="nav-item"> 4 <a href="{{ route('users.show', ['user' => $user->id]) }}" class="nav-link {{ Request::routeIs('users.show') ? 'active' : '' }}"> 5 TimeLine 6 <span class="badge badge-secondary">{{ $user->microposts_count }}</span> 7 </a> 8 </li> 9 {{-- フォロー一覧タブ --}} 10 <li class="nav-item"> 11 <a href="{{ route('users.followings', ['id' => $user->id]) }}" class="nav-link {{ Request::routeIs('users.followings') ? 'active' : '' }}"> 12 Followings 13 <span class="badge badge-secondary">{{ $user->followings_count }}</span> 14 </a> 15 </li> 16 {{-- フォロワー一覧タブ --}} 17 <li class="nav-item"> 18 <a href="{{ route('users.followers', ['id' => $user->id]) }}" class="nav-link {{ Request::routeIs('users.followers') ? 'active' : '' }}"> 19 Followers 20 <span class="badge badge-secondary">{{ $user->followers_count }}</span> 21 </a> 22 </li> 23 {{-- お気に入り一覧タブ --}} 24 <li class="nav-item"> 25 <a href="{{ route('users.favorites', ['id' => $user->id]) }}" class="nav-link {{ Request::routeIs('users.favorites') ? 'active' : '' }}"> 26 Favorite 27 <span class="badge badge-secondary">{{ $user->favorites_count }}</span> 28 </a> 29 </li> 30</ul>
・favorites.blade
PHP
1@extends('layouts.app') 2 3@section('content') 4 <div class="row"> 5 <aside class="col-sm-4"> 6 {{-- ユーザ情報 --}} 7 @include('users.card') 8 </aside> 9 <div class="col-sm-8"> 10 {{-- タブ --}} 11 @include('users.navtabs') 12 {{-- お気に入り一覧 --}} 13 @include('users.favoriteUsers') 14 </div> 15 </div> 16@endsection
・favoriteUsers.blade
PHP
1@if (count($favoritePosts) > 0) 2 <ul class="list-unstyled"> 3 @foreach ($favoritePosts as $favoritePost) 4 <li class="media"> 5 <div class="media-body"> 6 <div> 7 {{-- 投稿の所有者のユーザ詳細ページへのリンク --}} 8 {!! link_to_route('users.show', $favoritePost->user->name, ['user' => $favoritePosts->user->id]) !!} 9 <span class="text-muted">posted at {{ $favoritePosts->created_at }}</span> 10 </div> 11 <div> 12 {{-- ユーザ詳細ページへのリンク --}} 13 <p>{!! link_to_route('users.show', 'View profile', ['user' => $user->id]) !!}</p> 14 </div> 15 </div> 16 </li> 17 @endforeach 18 </ul> 19 {{-- ページネーションのリンク --}} 20 {{ $users->links() }} 21@endif
回答2件
あなたの回答
tips
プレビュー