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

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

ただいまの
回答率

87.49%

Laravelの連想配列について

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 699

score 178

ララベルの初心者です。

ララベルを使って、掲示板アプリを作成しています。

edit.blade.phpのformで更新処理を実行するために、
post_idに紐づく投稿に対して、コントローラー内のupdateメソッドを実行するようにしたいのですが、
下記のようにエラーが発生していまっている状況です。

まずララベルの基本的なことから質問させていただきたいでのすが、
edit.blade.phpの['post_id' => $post"]の$postの変数部分には具体的にどこのデータが入ってきますでしょうか?
またどんな変数、値をここにいれるべきでしょうか?

データの受け渡しで混乱している状況であり、大変基本的なことだと思いますが、ご教示いただけると幸いです。

edit.blade.php

 <form method="POST" action="{{ route('posts.update', ['post_id' => $post"] ) }}">

web.php

Route::post('/post/{post_id}/edit', 'PostsController@update')->name('posts.update');

PostController

    //投稿編集処理を実行する。
    public function update($post_id, Request $request)
    {
        $post = new Post;
        $post->title = $request->title;
        //コンテンツ
        $post->body = $request->body;

        $post->save();

        return redirect()->route('posts.show', ['post' => $post]);
    }

イメージ説明
エラー詳細リンク

web.php

//投稿フォームページ
Route::group(['middleware' => 'auth'], function() {
    Route::get('/post', 'PostsController@showCreateForm')->name('posts.create');
    Route::post('/post', 'PostsController@create');

    //投稿詳細ページ
    Route::get('/post/{post_id}', 'PostsController@show')->name('posts.show');

    //投稿編集画面ページ
    Route::get('/post/{post_id}/edit', 'PostsController@showEditForm')->name('posts.edit');

    //投稿編集
    Route::post('/post/{post_id}/edit', 'PostsController@update')->name('posts.update');

    //投稿削除
    Route::delete('/post/{post_id}', 'PostsController@destroy')->name('posts.destroy');
});

PostContoller.php

    //投稿編集ページを表示する。
    public function showEditForm($post_id)
    {
        return view('posts/edit');
    }

    //投稿編集処理を実行する。
    public function update($post_id, Request $request)
    {
        $post = new Post;
        $post->title = $request->title;
        //コンテンツ
        $post->body = $request->body;

        $post->save();

        return redirect()->route('posts.show', ['post' => $post]);
    }

    //投稿詳細ページを表示する。
    public function show($post_id)
    {
    $post = Post::findOrFail($post_id);

    return view('posts.show', [
        'post' => $post,
    ]);
    }

edit.blade.php

@extends('layout')

@section('content')
    <div class="container mt-4">
        <div class="border p-4">
            <h1 class="h5 mb-4">
                投稿の編集
            </h1>
            <form method="POST" action="{{ route('posts.update', ['post_id' => $post] ) }}">
                @csrf
                @method('PUT')

                <fieldset class="mb-4">
                    <div class="form-group">
                        <label for="title">
                            タイトル
                        </label>
                        <input
                            id="title"
                            name="title"
                            class="form-control {{ $errors->has('title') ? 'is-invalid' : '' }}"
                            value="{{ old('title') ?: $post->title }}"
                            type="text"
                        >
                        @if ($errors->has('title'))
                            <div class="invalid-feedback">
                                {{ $errors->first('title') }}
                            </div>
                        @endif
                    </div>

                    <div class="form-group">
                        <label for="body">
                            本文
                        </label>

                        <textarea
                            id="body"
                            name="body"
                            class="form-control {{ $errors->has('body') ? 'is-invalid' : '' }}"
                            rows="4"
                        >{{ old('body') ?: $post->body }}</textarea>
                        @if ($errors->has('body'))
                            <div class="invalid-feedback">
                                {{ $errors->first('body') }}
                            </div>
                        @endif
                    </div>

                    <div class="mt-5">
                        <a class="btn btn-secondary" href="{{ route('posts.show', ['post_id' => 1]) }}">
                            キャンセル
                        </a>

                        <button type="submit" class="btn btn-primary">
                            更新する
                        </button>
                    </div>
                </fieldset>
            </form>
        </div>
    </div>
@endsection
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

コードを見る限り $postはposts.showにしか返してないようです。
posts.editを返しているコントローラメソッドでも

    public function showEditForm($post_id)
    {
        return view('posts/edit');
    }


のように何も渡してません。
受け取った$post_idで検索した結果を渡すつもりなら、そのように書く必要があります。

もう少し丁寧に「ルーティング→コントローラ(→モデル)→ビュー」の関連性をおさえたほうが良いと思います。
ただこのあたりはMVCの基本的な概念でもありますし、ある程度PHPに知見があれば想像つきそうな部分でもあります。

Laravelは「Web職人のためのフレームワーク」といううたい文句があり、PHPに限らずWebに対してそれなりの技術と経験が前提となっていると言えます(実際にteratailに「まだ全然使える段階じゃなさそう」という質問内容は多い)。
ある程度ドキュメントで補完できる部分はありますが、読み解くにもその前提は崩れませんので、自身の現在地とそれが合致しているかどうかは考えたほうが良いと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/11/07 09:09

    ご回答いただきありがとうございます。
    ご指摘いただいた部分を編集したところ、エラーが出ずに編集画面に遷移することができるようになりました。
    回答者様のおっしゃる通り、自分のMVCへの理解が甘いように思えます。
    一旦、MVCに復習してみようと思います。

    キャンセル

+1

質問主様がweb.phpで定義している通りposts.showにはパラメータとして「post_id」が指定できるようになっています。
そのため、オブジェクトを渡すのではなく、idをわたしてあげてください

return redirect()->route('posts.show', ['post_id' => $post->id]);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/11/07 09:14

    ご回答いただきありがとうございます。
    投稿を編集した後に、エラーがでて投稿確認画面に遷移することができなくなっていたのですが、
    ご回答者のご指摘いただいた通りに、修正したところ、エラーが解消しました。

    回答者様に回答いただいたパラメータ、オブジェクトという用語の理解を怪しい部分があるので、一旦その辺を復習してみようと思います。

    キャンセル

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

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る