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

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

ただいまの
回答率

87.78%

Laravelを使ってPOSTでデータの受け渡し

受付中

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 2,224

score 17

Laravelを使って新規作成フォームを作成いたしました。

ただ新規作成のフォームからPOSTでデータを受け渡そうとすると、必要なデータが渡せなくて保存できません。 PHP、Laravelに詳しい方、ご教授いただけないでしょうか。

【エラー内容】

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'plan_id' cannot be null (SQL: insert into `corps` (`name`, `plan_id`, `credit_key`, `payment_status`, `payment_method_id`, `payment_date`, `postal_code`, `prefecture_id`, `address1`, `address2`, `updated_at`, `created_at`) values (ほげほげほげお, , , 支払済み, , , 123-1234, , 宮城町, 宮城333-3333, 2018-09-13 12:44:21, 2018-09-13 12:44:21))

イメージ説明

上記のようなエラーが発生し、corpモデルの値は取得できているのですが、
ほかの紐づいたデータを取得することができません。

実際のコード、リレーションはこの様になっております
【corpモデル】

    public function prefectures() {
      return $this->belongsTo('App\Models\Prefecture', 'prefecture_id');
    }

    public function plans() {
       return $this->belongsTo('App\Models\Plan','plan_id');
    }

    public function payment_methods() {
      return $this->belongsTo('App\Models\PaymentMethod', 'payment_method_id');
    }

【 新規作成View】

                    <div class="nav">
                      <div class="col-md-6 col-md-offset-3">
                        <form method="post" action="{{ url('/corps') }}">
                        {{ csrf_field() }}
                        <label for="name">NAME:</label>
                          <input type="text" name="name" class="form-control">

                        <label for="payment_method_name" >支払い方法</label>
                        <select class="form-control">
                          <option value="">選択してください</option>
                          @foreach($payment_method as $payment_method )
                            <option value="{{ $payment_method->name }}">{{ $payment_method->name }}</option>
                          @endforeach
                        </select>
                        <label for="plan">プラン:</label>
                        <select class="form-control">
                          <option value="">選択してください</option>
                          @foreach($plan as $plan)
                            <option value="{{ $plan->name }}">{{ $plan->name }}</option>
                          @endforeach
                        </select>

                      <div class="form-group">
                        <label for="name2">次回支払日:</label>
                          <div class='input-group date' id='datepicker'>
                              <input type='text' class="form-control datepicker">
                              <span class="input-group-addon">
                                  <span class="glyphicon glyphicon-calendar"></span>
                              </span>
                          </div>
                      </div>

                      <label for="name2">支払い状況:</label>
                      <input type="text" name="payment_status" class="form-control">

                      <label for="name2">郵便番号:</label>
                        <input type="text" name="postal_code" class="form-control">

                      <label for="name2">都道府県:</label>
                      <select class="form-control">
                        <option value="">選択してください</option>
                        @foreach($prefecture as $prefecture)
                          <option value="{{ $prefecture->name }}">{{ $prefecture->name }}</option>
                        @endforeach
                      </select>

                      <label for="name2">住所1:</label>
                        <input type="text" name="address1" class="form-control">

                      <label for="name2">住所2:</label>
                        <input type="text" name="address2" class="form-control">


                    <!-- <div class="parent"> -->
                      <!-- <div class="botton left"> -->
                        <a href="{{ action('CorpsController@index', $corp) }}" class="btn btn-outline-secondary">一覧に戻る</a>

                        <input type="submit" value="確認" class="btn btn-outline-success"></input>
                        <input type="hidden" name="_token" value="{{csrf_token()}}">
                      <!-- </div> -->
                    </div>
                    </form>


【コントローラー】

    public function store(Request $request)
    {
      $corp = new Corp();
      $corp->name = $request->name;
      $corp->plan_id = $request->plan; #⇦ここの記述が分からない
      $corp->credit_key = $request->credit_key;
      $corp->payment_status = $request->payment_status;
      $corp->payment_method_id =$request->payment_method_id;#⇦ここの記述が分からない
      $corp->payment_date =$request->payment_date;
      $corp->postal_code =$request->postal_code;
      $corp->prefecture_id =$request->prefecture_id;#⇦ここの記述が分からない
      $corp->address1 =$request->address1;
      $corp->address2 =$request->address2;

      $corp->save();
      return redirect('/');

    }

コントローラーの記述方法がわからないので、そこを改善できれば、保存できるのでは?と思うのですが。。。
何かわかる方いらっしゃいましたらお教えいただけないでしょうか。
よろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

0

確か...
他の<input>タグと同様に[name]属性を<select>タグにつければ、<option>タグの[value]を取得できたはずです。
もしかしたら取得は配列かも

<select class="form-control" name="plan">
    <option value="">選択してください</option>
    @foreach($plan as $plan)
        <option value="{{ $plan->name }}">{{ $plan->name }}</option>
    @endforeach
</select>

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

Column 'plan_id' cannot be null
// 訳: plan_idカラムにnullは入らないよ

plan_id が送信できておらずnullです。

本文の キャプチャ を見れば分かる通り、 plan_id が含まれていないですよね。

<select class="form-control"> に name 属性がないことが原因です。

http://www.htmq.com/html/form.shtml

name="名前"
スクリプト言語などから参照できるよう名前を指定する

formの基本を確認して下さい。

コントローラの記述に合わせるなら name="plan" が必要です。
他にも送信できていない項目がありますが同じ原因です。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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