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

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

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

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

Blade

Bladeとは、 PHPフレームワークのLaravelで使用することができるテンプレートエンジンです。テンプレートの継承とエスケープ機能を提供します。

Q&A

解決済

2回答

2918閲覧

Laravelにて変数の受け渡しができません。

KOSUKE.

総合スコア6

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

Blade

Bladeとは、 PHPフレームワークのLaravelで使用することができるテンプレートエンジンです。テンプレートの継承とエスケープ機能を提供します。

0グッド

0クリップ

投稿2020/10/12 11:31

編集2020/10/15 12:14

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

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

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

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

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

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

m.ts10806

2020/10/12 20:58

画像は外部サイトはなくteratailの画像添付機能を利用してください。
m.ts10806

2020/10/12 21:04

あとコードブロックの冒頭は言語名です。 Laravelはあくまでフレームワークの名称です。 言語はPHPないしHTML(Bladeでも良いかな)ですね。
KOSUKE.

2020/10/14 13:07

ご指摘ありがとうございます。
m.ts10806

2020/10/14 13:08

質問は編集できますので。
guest

回答2

0

ベストアンサー

if (\Auth::check()) {

ここがfalseのときにビューに空の配列が渡されるようになっているからではないでしょうか。
初期値を入れるか、未認証ユーザ用のレイアウトを考える必要があるかと思います。

投稿2020/10/12 21:03

m.ts10806

総合スコア80875

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

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

KOSUKE.

2020/10/14 13:02

ご回答ありがとうございます。 初期値を入れるは下記の記述で良いのでしょうか? ただ、この場合も同様のエラーが発生します。 public function index() { $data = ['0','0']; if (\Auth::check()) { // 認証済みの場合 // 認証済みユーザを取得 $user = \Auth::user(); // ユーザの投稿の一覧を作成日時の降順で取得 $microposts = $user->feed_microposts()->orderBy('created_at', 'desc')->paginate(10); $data = [ 'user' => $user, 'microposts' => $microposts, ]; } // Welcomeビューでそれらを表示 return view('welcome', $data); }
m.ts10806

2020/10/14 13:08

初期値は空だけが初期値ではありません。 初期値を渡すならViewで参照しているキーで作らないと意味がありません。 そのうえで、中身は空かどうかで分岐させないとキーの中身を参照しに行きます。 やはり、未認証ユーザ用のレイアウトを別途組んで別のviewにしたほうが良さそうに思います。 設計から考え直してみてください。
guest

0

favorites.blade
から
favoriteUsers.blade

includeの第2引数で
$favoritePosts
を渡していないのが原因ではないでしょうか?

つまり、こうではないでしょうか。(favorites.blade)
@include('users.favoriteUsers')

@include('users.favoriteUsers', ['favoritePosts' => $favoritePosts])

投稿2020/10/12 14:40

firegrape

総合スコア902

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

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

KOSUKE.

2020/10/14 13:06

ご回答ありがとうございます。 ご指摘の通りに修正しましたが、エラー内容は変わらずでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問