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

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

ただいまの
回答率

88.78%

Laravel モデルのインスタンス保存ができない

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,466

hideyov

score 18

昨日に引き続き「PHPフレームワーク Laravel入門」という書籍で勉強中ですが、モデルのadd/createアクションでエラーが出ました。
Person モデルへのaddとcreateアクションを PersonController.php に追記、ルート情報も追加後、 http://homestead.test/person/add のページは表示されますが、フォーム送信するとエラーが出ます。

add のページは表示され、フォームに入力まではできる
add のページは表示され、フォームに入力まではできる

フォーム送信するとエラーが出る
フォーム送信するとエラーが出る

関係するファイルを示しますので、アドバイスをお願いします!
さらに必要な情報がございましたら、御指摘ください。

モデル

app/Person.php

<?php

namespace App;
use Illuminate\Database\Eloquent\Model;

class Person extends Model
{
        protected $guarded = array('id');

        public static $rules = array(
                'name' => 'required',
                'mail' => 'email',
                'age' => 'integer|min:0|max:150'
        );
}

コントローラ

app/Http/Controllers/PersonController.php

class PersonController extends Controller
{
        public function index(Request $request) {
                $items = Person::all();
                return view('person.index', ['items' => $items]);
        }

        public function find(Request $request) {
                return view('person.find', ['input' => '']);
        }

        public function search(Request $request) {
                $item = Person::nameEqual($request->input)->first();
                $param = ['input' => $request->input, 'item' => $item];
                return view('person.find', $param);
        }

        public function add(Request $request) {
                return view('person.add');
        }

        public function create(Request $request) {
                $this->validate($request, Person::$rules);
                $person = new Person;
                $form = $request->all();
                unset($form['_token']);
                $person->fill($form)->save();
                return redirect('/person');
        }
}

ルーティング

routes/web.php

use App\Http\Middleware\HelloMiddleware;

Route::get('hello', 'HelloController@index');
Route::post('hello', 'HelloController@post');

Route::get('hello/add', 'HelloController@add');
Route::post('hello/add', 'HelloController@create');

Route::get('hello/edit', 'HelloController@edit');
Route::post('hello/edit', 'HelloController@update');

Route::get('hello/show', 'HelloController@show');

Route::get('hello/del', 'HelloController@del');
Route::post('hello/del', 'HelloController@remove');

Route::get('person', 'PersonController@index');
Route::get('person/find', 'PersonController@find');
Route::post('person/find', 'PersonController@search');

Route::get('person/add', 'PersonController@add');
Route::post('person/add', 'PersonController@create');

ビュー

resources/views/person/add.blade.php

@section('menubar')
        @parent
        新規作成ページ
@endsection

@section('content')
        @if (count($errors) > 0)
        <div>
        <ul>
                @foreach($errors->all() as $error)
                        <li>{{$error}}</li>
                @endforeach
        </ul>
        </div>
        @endif
        <table>
        <form action="/person/add" method="post">
                {{ csrf_field() }}
        <tr><th>name: </th><td><input type="text" name="name" value="{{old('name')}}"></td></tr>
        <tr><th>mail: </th><td><input type="text" name="mail" value="{{old('mail')}}"></td></tr>
        <tr><th>age: </th><td><input type="text" name="age" value="{{old('age')}}"></td></tr>
        <tr><th></th><td><input type="submit" value="send"></td></tr>
        </form>
        </table>
@endsection

開発環境:Vagrant + VirtualBox / Homestead
言語:PHP 7.3.4-1+ubuntu18.04.1+deb.sury.org+3 
フレームワーク:Laravel Framework 5.5.45
DB:SQLite
Mac OSX 10.11.6

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

0

undefined methodは未定義のメソッドという意味です
エラーを出しているファイルはindex.blade.phpです

そういうエラーメッセージなので、まずは該当のファイルを調べてgetDataと書いている個所をチェックするのが良いです
もしそこら辺のネットから拾ってきた書き方を真似しているんだとしたら、それは事前にgetDataを定義した上でbladeに書いているからエラーになっていないだけなので、参考にしたサイトを良くみてはどうでしょう?
何かしら参考書を見て真似しただけというのなら、本が間違っているので内容の訂正等の情報が無いかチェックしてみましょう

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/06/23 11:23 編集

    私が買ったことがある別の言語のフレームワークの本で著者も自身で「飽きたら次のおもちゃへのタイプ」と語ってますね。特化したタイプではないので「動けばOK」のコードが載っていることも結構あるようです。
    もちろん質問者さんが前後の流れを汲まずにコードを書いている可能性もあるので、なんとも言えませんが。

    キャンセル

  • 2019/06/24 08:59

    ご回答ありがとうございます。
    コードは、問題が多いとの御指摘のある「PHPフレームワーク Laravel入門」を写経したものです。
    正誤表は確認済みです。
    当方、あるプログラミングスクールのコースで1ヶ月ほど前に初めてLaravelに触れたばかりで、まだ全体像が押さえられていないと痛感しています。ご指摘の点を解決するのにも少し時間がかかりそうです。
    もっと基礎を固めてから、戻ってくることになるかと思います。

    取り急ぎ、お礼まで...

    キャンセル

  • 2019/06/24 09:05 編集

    公式か
    https://laravel.com/
    公式の日本語訳ドキュメントは必ず確認しましょう。
    https://readouble.com/laravel/
    もしかしたらそことの機能的な不整合を見つけるだけで解決する可能性もあります

    キャンセル

0

この本は,昔読んだことがあり,同じところで詰まった記憶があります。

        public static $rules = array(
                'name' => 'required',
                'mail' => 'email',
                'age' => 'integer|min:0|max:150'
        );


の部分を,

        public static $rules = [
                'name' => 'required',
                'mail' => 'email',
                'age' => 'integer|min:0|max:150'
        ];


としたら行けたと思います。
別の本で,php5.4以上はarrayが非対応?と書いてあって,
それを信じて,上記のように書き直したんですよね。

ただ,今気になってPHPのドキュメントを見ても,
arrayは非対応という記述が見当たりませんでした(むしろ使えるのではないかとも思えてきました)。
信用できる情報ではないと思いますが,もし,まだ解決していなければ,
一度お試しいただけると幸いです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/06/26 22:08

    その辺りのことはこちらに
    https://php.net/manual/ja/language.types.array.php

    キャンセル

  • 2019/06/27 02:51

    上記URLにある「PHP 5.4 以降では配列の短縮構文が追加され、 array() の代わりに [] を使えるようになりました。 」という部分でしょうか。
    ただこれだと,別に使えないわけではないという印象を受けるのですが,いかがでしょうか。

    キャンセル

  • 2019/06/27 03:13

    回答読んだら曖昧そうに見えたのでマニュアルに書いてありますよ~って事で提示しました

    > 別に使えないわけではないと
    どちらの書き方でも可です
    自分が回答した回答に他の人が回答すると通知が来るので、読んでみた結果のお節介コメントだと思ってください

    キャンセル

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

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

関連した質問

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