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

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

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

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

PHP

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

Q&A

解決済

2回答

699閲覧

【Laravel】退会していないのに「このユーザーは退会しました」と出てしまう、投稿ページにアクセスできない

Keight

総合スコア9

Laravel

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

PHP

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

0グッド

0クリップ

投稿2020/05/11 15:10

編集2020/05/12 02:40

会員登録したユーザーが記事を投稿し、そのユーザーが退会を行った場合、記事の詳細ページに「このユーザーは退会しました」と表示させる仕組みにしてあるつもりなのですが・・・。
イメージ説明

UsersController@show

public function show($id)
{
$user = User::find($id);
$lectures = $user->lectures()->orderBy('created_at', 'desc')->paginate(4);

~~$data = [~~ ~~'user' => $user,~~ ~~'lectures' => $lectures,~~ ~~]; return view('users.show', $data);~~ ~~}~~

当初、上記のUsersControllerを載せていましたが、今回の対象はLecturesControllerでした、申し訳ありません。

LecturesController@show

PHP

1public function show($id) { 2 3 $lecture = Lecture::find($id); 4 $user = User::find($id); 5 6 return view('lectures.show', [ 7 'lecture' => $lecture, 8 'user' => $user, 9 ]); 10 }

lectures/show.blade.php

HTML

1@extends('layouts.app') 2 3@section('content') 4 5<div class="container"> 6 <div class="head">レクチャー詳細</div> 7 8 <div class="row ml-3 mt-5 pt-4"> 9 10 <div class="col-9 mx-auto"> 11 <article class="cont_inner"> 12 @if ($lecture) 13 @if ($lecture->image) 14 <figure class="show_post_thumbnail"><div class="new_area-img text-center"><img class="show_image" src="{{ asset('storage/'.$lecture->image) }}"></div></figure> 15 @else 16 <figure class="show_post_thumbnail"><div class="new_area-img text-center"><img src="../img/noimage.gif"></div></figure> 17 @endif 18 <section class="post_meta-all multiline line-8"> 19 <div class="pick_title mb-2">{{ $lecture->title }}</div> 20 <time>{{ $lecture->updated_at }}</time> 21 <div> 22 @if ($lecture->category_name == 'ピッチング') 23 <span class="tag-pitching">{{ $lecture->category_name }}</span> 24 @elseif ($lecture->category_name == 'バッティング') 25 <span class="tag-batting">{{ $lecture->category_name }}</span> 26 @elseif ($lecture->category_name == '守備') 27 <span class="tag-fielding">{{ $lecture->category_name }}</span> 28 @elseif ($lecture->category_name == '走塁') 29 <span class="tag-running">{{ $lecture->category_name }}</span> 30 @elseif ($lecture->category_name == 'メンタル') 31 <span class="tag-mental">{{ $lecture->category_name }}</span> 32 @elseif ($lecture->category_name == 'その他') 33 <span class="tag-other">{{ $lecture->category_name }}</span> 34 @endif 35 @if ($user === null) 36 <span class="d-inline-block ml-2 small text-info">投稿者:このユーザーは退会しました</span></div> 37 @else 38 <span class="d-inline-block ml-2 small text-info">投稿者:<a href="{{ route('users.show', ['id' => $user->id]) }}">{{ $user->name }}</a></span></div> 39 @endif 40 <div class="mt-3 mb-5">{{ $lecture->content }}</div> 41 </section> 42 @endif 43 </article> 44 @if (Auth::id() === $lecture->user_id) 45 <div class="text-center mt-4"> 46 {!! Form::open(['route' => ['lectures.destroy', $lecture->id], 'method' => 'delete']) !!} 47 {!! Form::submit('削除する', ['class' => 'btn btn-danger btn-sm del_check']) !!} 48 {!! Form::close() !!} 49 </div> 50 @endif 51 </div> 52@endsection

それと、「投稿する」のページにアクセスすると、エラーが出るようになりました。

イメージ説明

「このユーザーは退会しました」と出るものを修正しようと試みる前は問題なくアクセスできていたので、何かの拍子にそうなってしまったのかと思うのですが、ルーティングやコントローラーのcreate部分は特に触っていないですし、一応確認してみても、個人的には何らおかしいところは見受けられませんでした。


web.php

PHP

1// ユーザ機能 2Route::group(['middleware' => ['auth']], function () { 3 Route::resource('users', 'UsersController', ['only' => ['show']]); 4 Route::get('lectures/create', 'LecturesController@create')->name('lectures.create'); 5 Route::post('lectures', 'LecturesController@store')->name('lectures.store'); 6 Route::delete('lectures/{id}', 'LecturesController@destroy')->name('lectures.destroy'); 7 Route::delete('users/{id}', 'UsersController@destroy')->name('users.destroy'); 8});

LecturesController@create

PHP

1public function create() { 2 3 $lecture = new Lecture; 4 5 return view('lectures.create', [ 6 'lecture' => $lecture, 7 ]); 8 }

また、エラー内容を訳すと「非オブジェクトのプロパティ「user_id」を取得しようとしています」とのことで、tinkerにてあらためてLectureデータのカラムを確認しても、「user_id」は存在しています。
イメージ説明

いろいろとすみません、よろしくお願いいたしますm(_ _)m

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

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

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

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

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

yuuyu

2020/05/11 15:19

1.showが呼ばれているかの確認はしていますか? 2.User::findで該当する$idは存在していますか? 提示されているコードでは、UsersControllerがincludeされているかすら確認できないので、一度確認してみてください。
Keight

2020/05/11 15:32

ご回答ありがとうございます。 > showが呼ばれているかの確認はしていますか? これは、「web.php」の中の記述ということでしょうか? > User::findで該当する$idは存在していますか? 存在していますね。 データを確認してみたところ、現在ログイン中のユーザー(自分自身)のidが 4 となっていて、 投稿者:<a href="{{ route('users.show', ['id' => $user->id]) }}"> この部分で直接指定しているのですが、なぜか「このユーザーは退会しました」と出てしまいます(・_・;)
yuuyu

2020/05/11 15:38

>これは、「web.php」の中の記述ということでしょうか? 質問文に「web.php」が一切出てきてないのですが、「lectures/show.blade.php」が実行されている範囲内、ですね。 >この部分で直接指定しているのですが 「このユーザーは退会しました」という表示が出ているということは、この行にたどりついておらず、 @if ($user === null) がtrueになっている可能性が高いと思われます。
Keight

2020/05/11 15:45

あ、web.phpの中の記述に問題がある可能性があるのなら、web.phpの内容を載せようかと思った次第ですm(_ _)m showが呼ばれているかというのは、どういうことなんでしょうか? すみません、知識不足で???? @if ($user === null) がtrue・・・(´ε`;) ログインできており、記事の書き込みもでき、その書き込みをtinkerで確認したところ、ユーザーのidは 4 となっていますが、どうしてnullになるのか、怪しいところはどこか見受けられますでしょうか?
yuuyu

2020/05/11 15:52

>showが呼ばれているかというのは、どういうことなんでしょうか? showは関数なので、関数を呼び出さないと内部は実行されないため、どこかでshow関数を呼び出しているか、という意味です。 あと今気付いたのですが、$user変数に入れているのは $user = User::find($id); の行のみでしょうか? phpは基本的に関数の外と中で変数の共有をしないので、もしかしたら呼び出していても値のセットはできていないかもしれません。 例: $a = "test"; function func(){ $a = "sample"; } func(); echo $a; // "test"が出力される
Keight

2020/05/11 16:13

> showは関数なので、関数を呼び出さないと内部は実行されないため、どこかでshow関数を呼び出しているか、という意味です。 web.php でこのように書いておりますが、関係ないでしょうか? Route::resource('users', 'UsersController', ['only' => ['show']]); > あと今気付いたのですが、$user変数に入れているのは $user = User::find($id); の行のみでしょうか? phpは基本的に関数の外と中で変数の共有をしないので、もしかしたら呼び出していても値のセットはできていないかもしれません。 destroy のほうでも $user = User::find($id); としていますね。 public function destroy($id) { $user = User::find($id); if (\Auth::id() === $user->id) { $user->delete(); } return back(); } コントローラーのshowのところで dd($user->id);で確認をすると、 4 と返ってはきます。
m.ts10806

2020/05/11 19:40

質問は編集できますので適宜追記してください。 コメント欄はデフォルト非表示故、大事な情報が伝わらない可能性も高いです。
yuuyu

2020/05/12 01:26

>web.php でこのように書いておりますが、関係ないでしょうか? すみません、Laravelについて詳しくはないので、その関数が何をしているかは分からないのですが、 >コントローラーのshowのところで dd($user->id);で確認をすると、 4 と返ってはきます。 これをみる限り、おそらく呼び出しはできているので関係あるかもしれないです。 >destroy のほうでも $user = User::find($id); としていますね。 この2箇所でしょうか?destroyも関数なので、これだけならスコープの問題な気がします。
Keight

2020/05/12 02:16

表示させたいビューをよくよく考えてみると、今回の対象はUsersControllerのshowではなく、LecturesControllerのshowでした、すみません。 ただ、どちらにしてもやはり「このユーザーは退会しました」と出ていることに現状変わりはないですね。 「LecturesController@show」 public function show($id) { $lecture = Lecture::find($id); $user = User::find($id); return view('lectures.show', [ 'lecture' => $lecture, 'user' => $user, ]); }
guest

回答2

0

自己解決

Lectureモデル内でUserの定義をしていたので、LecturesController@showで「$user = User::find($id);」のお記述を消し、
ビュー(lectures/show.blade.php)の「$user->id」の部分を「$lecture->user->id」変更すると、投稿者名が正しく表示されるようになりました。
また、投稿ページ(lectures/create.blade.php)にアクセスを試みた際、レクチャー詳細ページ(lectures/show.blade.php)に飛ぼうとする症状については、ルーティングの順序が原因でした。
ルーティングのルールとして、上にあるものが優先されるとのことですが、showを同じgetであるcreateよりも上で記述していたのがよくなかったようです。

投稿2020/05/13 05:06

Keight

総合スコア9

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

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

0

return view('users.show', $data);

lectures/show.blade.php

showはshowでもディレクトリが違ってます


追記

@if ($lecture)
@endif

$lecture がある場合、のifブロックを抜けてから

@if (Auth::id() === $lecture->user_id)

$lecture を参照している
この時、$lectureがnullである可能性がある

投稿2020/05/11 23:09

編集2020/05/12 02:56
mikkame

総合スコア5036

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

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

Keight

2020/05/12 02:12 編集

ありがとうございます。 確認し直すと、LecturesControllerのほうでこのように記述しておりました。 public function show($id) { $lecture = Lecture::find($id); $user = User::find($id); return view('lectures.show', [ 'lecture' => $lecture, 'user' => $user, ]); } それでもやはり「このユーザーは退会しました」と出ています。 あと、なぜか今度は投稿フォームのページにアクセスした際に下記エラーが出るようになっていることに気付きました。 Trying to get property 'user_id' of non-object (View: E:\dev\htdocs\Laravel\bbl\resources\views\lectures\show.blade.php) tinkerでLectureのデータのカラムを見ても user_id は存在していますし、ルーティングも下記で合っていると思うのですが。 Route::get('lectures/create', 'LecturesController@create')->name('lectures.create');
Keight

2020/05/12 03:17

追記に対して・・・ @endifの位置を変え、 @if (Auth::id() === $lecture->user_id) <div class="text-center mt-4"> {!! Form::open(['route' => ['lectures.destroy', $lecture->id], 'method' => 'delete']) !!} {!! Form::submit('削除する', ['class' => 'btn btn-danger btn-sm del_check']) !!} {!! Form::close() !!} </div> @endif この部分まで包んでみました。 すると、「投稿する」のページにアクセスしてエラーは出なくなりましたが、本来表示させたい投稿フォームのページではなく、 lectures.show のページにアクセスされてしまうようです。 「投稿する」の部分は lectures.create に飛ばしたく、そのようにルーティング指定もしているのですが・・・。 https://gyazo.com/bff87ee9599b83a7c825580399938aed
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問