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

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

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

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

PHP

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

Blade

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

Q&A

解決済

5回答

1513閲覧

Laravelでのエラーの原因がわかりません

Himajin_akisyou

総合スコア12

Laravel

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

PHP

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

Blade

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

0グッド

0クリップ

投稿2020/04/11 02:31

編集2020/04/11 11:58

前提・実現したいこと

Laravelで下のbladeからweb.phpにルートするというボタンを作ったところ、下のようなエラーがコントローラー内で出てきました。
しかしこのweb.phpのrouteはエラーが発生しているメソッドは愚か、コントローラーさえ経由していません。
このようなエラーがなぜ出てしまうのでしょうか。
問題点と改善点をお願いいたします。

発生している問題・エラーメッセージ

Call to a member function comments() on null

該当のソースコード

blade

1<a href="{{route('create_post')}}"> 2 <button type="button" class="btn btn-primary btn-lg">新規投稿</button> 3</a>

php

1//web.php 2<?php 3 4use Illuminate\Support\Facades\Route; 5 6/* 7|-------------------------------------------------------------------------- 8| Web Routes 9|-------------------------------------------------------------------------- 10| 11| Here is where you can register web routes for your application. These 12| routes are loaded by the RouteServiceProvider within a group which 13| contains the "web" middleware group. Now create something great! 14| 15*/ 16 17Route::get('/', function () { 18 return view('welcome'); 19}); 20 21//ログイン確認不要 22Route::get('/mypage/{post_id}', 'PostController@edit')->name('edit_post'); 23Route::post('/mypage/{post_id}', 'PostController@editing'); 24 25Route::get('/mypage/{post_id}/{comment_id}')->name('comment_delete'); 26 27 28//ログイン確認必要 29// 30Route::get('/mypage', 'MypageController@index')->name('mypage'); 31//新規投稿 32//ここのルートを実行しました 33Route::get('/mypage/post', function(){ 34 return view('create_post'); 35})->name('create_post'); 36 37 38Auth::routes(); 39Route::get('/home', 'HomeController@index')->name('home'); 40

php

1//controller 2<?php 3 4namespace App\Http\Controllers; 5 6use Illuminate\Http\Request; 7use App\Post; 8use Illuminate\Support\Facades\Auth; 9use App\Comment; 10use App\User; 11 12class PostController extends Controller 13{ 14 // 15 public function index($id){ 16 $post = Post::find($id); 17 $comment = $post->comments()->get(); 18 19 return view('edit_post', [ 20 'id' => $id, 21 'post' => $post, 22 'comment' => $comment, 23 ]); 24 } 25 26 27 public function edit(Request $request ,$id){ 28 $post = Post::find($id); 29 $post->url = $request->input('url'); 30 $post->save(); 31 32 return redirect()->route('mypage'); 33 } 34} 35

php

1//Post.php 2<?php 3 4namespace App; 5 6use Illuminate\Database\Eloquent\Model; 7 8class Post extends Model 9{ 10// 11public function comments(){ 12return $this->hasMany('App\Comment'); 13} 14 15public function user(){ 16return $this->belongsTo('App\User'); 17} 18}

###追記
ターミナルでphp artisan route:list --name=create_postを実行した結果です。

+--------+----------+-------------+-------------+---------+------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+----------+-------------+-------------+---------+------------+ | | GET|HEAD | mypage/post | create_post | Closure | web | +--------+----------+-------------+-------------+---------+------------+

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

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

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

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

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

m.ts10806

2020/04/11 02:35 編集

Laravel独自のエラーではないですけど(オブジェクト指向、ひいてはユーザー定義関数レベルです) Postモデルのコードはどうなってますか?
Himajin_akisyou

2020/04/11 03:01

<?php namespace App; use Illuminate\Database\Eloquent\Model; class Post extends Model { // public function comments(){ return $this->hasMany('App\Comment'); } public function user(){ return $this->belongsTo('App\User'); } } こんな感じです。また、他のPostのcommentsメソッドを使ったルートは正常に作動しております。 よろしくお願いいたします。
m.ts10806

2020/04/11 03:03

質問は編集できますので適宜調整してください。
Lulucom

2020/04/11 06:55

`php artisan route:list --name=create_post` の結果も載せていただけますか?
Himajin_akisyou

2020/04/11 07:05

結果を載せさせていただきましたので、ご確認ください。 よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2020/04/11 07:08

Post.php の実装を質問文に追記してください。
Himajin_akisyou

2020/04/11 07:11 編集

追記させていただきました。ご確認ください。 よろしくお願いします。
Lulucom

2020/04/11 07:18 編集

`[App\Http\Controllers\CommentController] does not exist.` と言われていますので、CommentControllerクラスを作成しておくか、routes/web.phpでCommentControllerと記述しているところをコメントアウトしてから、再度、先ほどのコマンドを実行してその結果に差し替えていただけますか?
Himajin_akisyou

2020/04/11 07:21

了解いたしました。 訂正いたしましたので、ご確認ください。 よろしくお願いいたします。
Lulucom

2020/04/11 07:34

エラーが起きるのは、そのボタンを押したときかと思っていましたが、もしかしてそのボタンがあるページを表示しようとしたときでしょうか?もしそうでしたら、そのページを表示するアクションのコードを掲載していただけますか?
Himajin_akisyou

2020/04/11 08:13

返信遅れてしまい、申し訳ありません。 ボタンを押した時です。 よろしくお願いいたします。
Lulucom

2020/04/11 08:30 編集

> 下のようなエラーがコントローラー内で出てきました どのコントローラアクションのどの行で発生しているかも掲載できますか?
Himajin_akisyou

2020/04/11 09:15

PostControllerのindexメソッドの Scomment = 〜 というところです
Lulucom

2020/04/11 11:50

routes/web.php の全文の掲載は難しいでしょうか。
Himajin_akisyou

2020/04/11 11:59

あろがとうございます。 掲載いたしました。ご確認をお願いいたします。
Lulucom

2020/04/12 00:20

PostController@indexへのルートが無いようなので不思議ですね... 考えにくいですが、routes/web.phpのクロージャで処理されcreate_post.blade.phpが一旦は表示されているけど、その後どこかでPostController@indexアクションへ直接飛ばしている、というような可能性はないでしょうか。
Himajin_akisyou

2020/04/12 05:57

ありがとうございます。 create_post.blade.phpの中身を全て消して実行してみたのですが同じエラーが出てしまったのでないと考えています。
Lulucom

2020/04/12 06:04

そうですよね…。 create_postのルートを最初の方(welcomeのルートの直後あたり)に移動すると挙動が変わらないでしょうか。つまりルート定義順が絡んでいるのではないかと推測しています。
Himajin_akisyou

2020/04/12 06:10

できました! 何度も連絡いただいて本当にありがとうございます! ベストアンサーにさせていただきたいのでお手数をおかけしますが回答に書いていただいてもよろしいでしょうか?
guest

回答5

0

findメソッドの返却値は「コレクション」です。

Laravel 7.x Eloquent:利用の開始

また、主キーの配列をfindメソッドに渡し、呼び出すこともできます。一致したレコードのコレクションが返されます。

php

1 $post = Post::find($id); 2 $comment = $post->comments()->get(); //$postはPostモデルではなくコレクション

コレクションなので独自で作られているであろうcomments()というメソッドは持っていません。

Eloquent:コレクション

の「使用できるメソッド」参照

つまり、「エラーの通り、指定したメソッドをオブジェクトが持っていない」が原因です。

タイトルからすると「エラーの原因」をお探しのようなので、以上が回答になります。

投稿2020/04/11 03:10

m.ts10806

総合スコア80850

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

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

Himajin_akisyou

2020/04/11 05:41

ご回答ありがとうございます。 失礼を承知で申し上げますが、質問内容をご確認いただけましたでしょうか?
m.ts10806

2020/04/11 05:55

読んだ上で「可能な回答」をしてます。 「確認してほしいところがある」のでしたら、「どこのことか」明記しないと分かりません。 それがもし「改善点が回答として書いてないじゃないか」と仰りたいのでしたら、 「改善点」というのはゴールが明示されないと無理な話ですので、書いてません。 また、「エラーの原因が分かれば作っているものの仕様を最も知っているのは質問者自身だから、 あとは何とかできるのでは」と判断しました。 もしこれ以上のアドバイスを得たいのでしたら、仕様や要件を”質問本文に”具体的に記載してください。
Himajin_akisyou

2020/04/11 06:46

私が質問として載せているのは「なぜcommentsメソッドが使えないのか」ではなく「なぜcmmentsメソッドを含んでいるメソッドは愚か、コントローラークラスも経由していないのにもかかわらず、コントローラーからエラーが出ているのか」というものです。これは上記に書いてある内容をご確認いただけているのならば理解いただけていることと存じます。 私の知見が少ないからかもしれませんが、ご回答いただいた内容は私の質問内容に沿った回答ではないと判断いたしました。具体的には「なぜcommentメソッドが使えないのか」という質問と勘違いなさっていると感じました。それはエラー文のみ見ているからなのではと思い、質問内容をご確認いただけたかと確認させていただいた次第でございます。 つまり私が確認したかったことは、私が、あなた様の回答が私が質問している内容に答えてないと感じたために質問内容を把握されているか、ということです。 もし、私の質問に沿った回答なのであれば手間をとらせてしまうのですが、もう少しわかりやすく書いていただけないでしょうか。上記の文章からもうお分かりになっているかと存じますが、あなたの回答が私の疑問を解決してくれるピースの一つになっていると気づけていません。 よろしくお願いいたします。 長文失礼いたしました。
m.ts10806

2020/04/11 07:05

タイトルである「Laravelでのエラーの原因がわかりません」と「発生している問題・エラーメッセージ」からすると妥当な理由を回答として提示したつもりです。 この内容だけだと「エラーが分かってないのかな」という印象を受けました。 ですので、そこから入っています。もしエラーメッセージ自体を理解されているのでしたら、その旨を質問本文に記載しないと誰にも伝わりません。エスパーを強いていることになります。 いずれにせよ、Fatalエラーはそこを通らないと起きないエラーなので、「経由してない」わけがないので、「そこを通っている」前提で回答しています。なので、読んでないわけではないです。 それこそ「どういうことがしたくて質問したか」分かりやすく書いてください。 そのように長文で私の回答云々言ってる暇に、質問本文を充実させた方が幾らか問題解決に繋がるでしょう。 既に指摘してますが、質問は編集できますので追記してください。
Himajin_akisyou

2020/04/11 07:15

あなたが質問内容をご確認いただけてないからでないかではないでしょうか? そもそもあなたが具体的に書けとおっしゃったのでわざわざ記載したのですが。私は丁寧にお答えしています。 そのように喧嘩腰はやめてください。 正直に言って迷惑です。
m.ts10806

2020/04/11 07:26

えっと。 「質問内容をご確認いただけましたでしょうか? 」と先に喧嘩腰としかとれないコメントをしておいて「迷惑」と言われても非常に困ります。 書かれている以上のことをくみ取るのは他人には無理というのが伝われば良いのですけど・・・。
m.ts10806

2020/04/11 07:28

私自身、問題解決にしか興味がないので、喧嘩腰でもなんでもないですよ。 淡々としてます。 それを喧嘩腰だと捉えるのはあなたが喧嘩吹っ掛けてるつもりだからだと思います。 落ち着きましょう。
Himajin_akisyou

2020/04/11 08:22

質問内容確認してますか?→確認して欲しいところを具体的に書け→具体的に書いた→「そのように長文で私の回答云々言ってる暇に、質問本文を充実させた方が幾らか問題解決に繋がるでしょう。」 そりゃ誰だって怒りますよ。 最初は回答していただけたと思いましたよ。でもそれが質問内容をしっかし読んでいないことがわかって「内容確認しましたか?」って言ったら、「どこ?詳しく言え」って言われたから詳しく書いたら、「そんなに長文で詳しく書いている暇があるんだったらその時間で解決するんじゃないですか」とか意味不明でしょう。 <上文> 私自身、問題解決にしか興味がないので、喧嘩腰でもなんでもないですよ。 淡々としてます。 それを喧嘩腰だと捉えるのはあなたが喧嘩吹っ掛けてるつもりだからだと思います。 落ち着きましょう。 <上文> あなたが私の時間を奪っているから問題が解決しないんですよ。 あなたこそ自分の回答を読んでください。矛盾ばっかり言ってますから。 解決にしか興味がないんだったらしっかり質問文を読んだ上で答えたほうがいいんじゃないですか? もうコメントしないでください。 本当に迷惑です。
m.ts10806

2020/04/11 08:24

>あなたが私の時間を奪っているから そういうスタンスなら結構です。 質問者が神様とでも思ってるんでしょうか。
Himajin_akisyou

2020/04/11 08:27

コメントしないでください。 何度も言いますが迷惑です。
guest

0

ベストアンサー

create_postのルートを最初の方(welcomeのルートの直後あたり)に移動すると挙動が変わらないでしょうか。ルート定義順が絡んでいるのではないかと推測しています。

投稿2020/04/12 06:12

Lulucom

総合スコア1899

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

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

Himajin_akisyou

2020/04/12 06:20

何度も連絡いただき紳士に解決に尽力していただき本当にありがとうございます。 解決することができました。
guest

0

php

1 2class PostController extends Controller 3{ 4 // 5 public function index($id){ 6 $post = Post::find($id); 7 // $comment = $post->comments()->get(); 8 $comments = $post->comments; // hasManyなんだから、$comments のほうが適切。そもそもこの行は不要。別途説明する。 9 10 return view('edit_post', [ 11 'id' => $id, 12 'post' => $post, 13 'comment' => $comments, 14 ]); 15 } 16}

$post を bladeに渡せば、 blade内で comments を取得できるのでコントローラーに書く必要はない。
同じ理由で$id も話たす必要ない。

php

1class PostController extends Controller 2{ 3 // 4 public function index($id){ 5 $post = Post::find($id); 6 return view('edit_post', [ 7 'post' => $post 8 ]); 9 } 10}

その他おかしいところ

index() は一覧を実装すべきメソッド名です。なぜに「edit_post」なのか??非常に紛らわしいし、ミスを誘発するダメな実装です。

投稿2020/04/11 07:25

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/04/11 09:56

この回答のどこが低評価なのかな?
guest

0

php artisan route:clearを実行してから再確認するとどうでしょうか。

投稿2020/04/11 07:23

Lulucom

総合スコア1899

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

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

Himajin_akisyou

2020/04/11 08:24

ご回答ありがとうございます。 やってみましたが解決しませんでした。
guest

0

button要素を使わずa要素だけにするとどうでしょうか。

php

1<a href="{{ route('create_post')}}" class="btn btn-primary btn-lg">新規投稿</a>

投稿2020/04/11 05:55

Lulucom

総合スコア1899

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

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

Himajin_akisyou

2020/04/11 06:48

ご回答ありがとうございます。 やってみましたが同じエラーが出てしまいました。
Lulucom

2020/04/11 08:19

そうでしたか。ただ、このボタンはリンクですのでbuttonを使わずaのみで作成すべきだとは思います。
Himajin_akisyou

2020/04/11 08:25

わかりました。 貴重な助言ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問