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

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

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

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

PHP

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1354閲覧

inputで入力された値を使って複数レコードの更新をしたい

kentooooo

総合スコア18

Laravel

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

PHP

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2019/11/13 01:23

編集2019/11/13 01:57

前提・実現したいこと

laravel勉強中の初心者です。よろしくお願いします。

同じname属性のinputタグを使い、メッセージを登録し、更新したい
メッセージの登録(create)はできたのですが更新ができなくて困っています(全てnullになる)

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

エラーメッセージはなく、更新処理をすると全てnullになります

該当のソースコード

$Messageにはあらかじめ登録されたメッセージが入っています。

html

1 2//edit画面 3<form action=""> 4 <tr> 5 <td><input class="form-control" name="receive_message_1[]" value='{{$Message->receive_message_1}}'></td> 6 <td><input class="form-control" name="receive_message_2[]" value='{{$Message->receive_message_2}}'></td> 7 <td><input class="form-control" name="receive_message_3[]" value='{{$Message->receive_message_3}}'></td> 8 </tr> 9 <tr> 10 <td><input class="form-control" name="receive_message_1[]" value='{{$Message->receive_message_1}}'></td> 11 <td><input class="form-control" name="receive_message_2[]" value='{{$Message->receive_message_2}}'></td> 12 <td><input class="form-control" name="receive_message_3[]" value='{{$Message->receive_message_3}}'></td> 13 </tr> 14</form>

このような感じで、おなじname属性のinputタグが2つづつ、計6つあります。このような時にはinputを配列にする必要がある、と見ましたので[]がついています。

laravel

1create画面のHTMLは上記とほぼ同じです(value部分がないだけ) 2create部分のコントローラーは以下のような感じです 3 4public function store(Request $request,Message $message){ 5     //メッセージ登録する:配列で値を受け取る 6 $data = array( 7 'receive_message_1' => $request->input('receive_message_1'), 8 'receive_message_2' => $request->input('receive_message_2'), 9 'receive_message_3' => $request->input('receive_message_3'), 10 ); 11 12 //dataを展開して値を入れた 13 $i = 0; 14 foreach ($data['receive_message_1'] as $d) { 15          $message = new Message; 16 $message->receive_message_1 = $request->receive_message_1[$i]; 17          $message->receive_message_2 = $request->receive_message_2[$i]; 18 $message->receive_message_3 = $request->receive_message_3[$i]; 19 $message->save(); 20 $i++; 21 } 22 return redirect('/'); 23 } 24 25 26 27 28public function update(Request $request, Message $message){ 29 30 // 配列で受け取る 31 $data = array( 32 'receive_message_1' => $request->input('receive_message_1'), 33 'receive_message_2' => $request->input('receive_message_2'), 34 'receive_message_3' => $request->input('receive_message_3'), 35 'created_at' => Carbon::now(), 36 'updated_at' => Carbon::now(), 37 ); 38//dataを展開して更新してみました、がうまくいかず 39 $i = 0; 40 foreach ($data['receive_message_1'] as $d) { 41 $message->receive_message_1 = $request->receive_message_1[$i]; 42 $message->receive_message_2 = $request->receive_message_2[$i]; 43 $message->receive_message_3 = $request->receive_message_3[$i]; 44 $message->save(); 45 $i++; 46 } 47 return redirect("/") 48}

試したこと

$message->receive_message_1や$request->input('receive_message_3')に値が入っていることは確認できましたが、更新がうまくいきません

補足情報(FW/ツールのバージョンなど)

laravel5.6、リソースコントローラー使用して構築しています

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

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

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

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

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

sola-msr

2019/11/13 01:48

> メッセージの登録(create)はできたのですが このメソッドも記載したほうがいいかと
yambejp

2019/11/13 01:54

inputにtypeが指定されていませんがテキストボックスで間違いないですか? またformにダイレクトにtrを書くのはNGです
kentooooo

2019/11/13 01:58

type:textです。 メソッドも記述いたしました。よろしくお願いします
mikkame

2019/11/13 04:52

なにがどううまくできないんでしょうか? エラーが出るのか、更新されないのか、一部だけ更新されるのか 回答者はそれを脳内で実行してor同じ環境を整備して確認するしかありません。
kentooooo

2019/11/13 05:28

エラーがでなくて、DB が全部null になってしまうんです。
mikkame

2019/11/13 05:31

全部というのは、該当のMessageだけですか? 他のMessageもでしょうか?
kentooooo

2019/11/13 05:46

他のメッセージもすべてです。
mikkame

2019/11/13 05:52

他のメッセージも、ということであれば何かしらおかしいですね。 そもそもですが、 配列を送って、ループして更新している。ということは 正常に動いたとしても最後の1行分しか反映されない、という事にはお気づきでしょうか。 まずはupdateの引数に入っている$messageをddして、更新対象があっているかを確認してみてはどうでしょうか
kentooooo

2019/11/13 05:59

>そもそもですが、 配列を送って、ループして更新している。ということは 正常に動いたとしても最後の1行分しか反映されない、という事にはお気づきでしょうか。 そうだったんですね。うまく理解ができてないみたいです。 配列のやり方以外にどんなやり方があるんでしょうか?
mikkame

2019/11/13 06:12 編集

引数で渡ってくる$messageは確認しましたか? これが、更新対象のレコード(行)です。 それを繰り返し(foreach)保存(save)しているので、最終的には最後のデータ(配列ないの最後)しか残らない という解釈です
kentooooo

2019/11/13 07:03

すっきりと理解できる説明です。 ありがとうございます。 ddした結果がnullでした…。 考えが煮詰まってしまっています。 少し話がそれるのですが、 Createは配列を使ってうまくできてるのですが、このやり方で大丈夫なものでしょうか?
mikkame

2019/11/13 08:14 編集

createは問題ありません リソースコントローラのupdateは基本的に特定のレコードのみ更新する事を前提としています (PUT /message/1 で、idが1番のものを更新する、 100番を更新したければ /message/100) 一括更新を行いたいのであれば あたらしく function bulkUpdate(Request $request) を追加し(web.phpも同様に修正する) そこに一括更新用のコードを書くのがベターかと思われます また、別の問題で、現在のコードですとそれは一体何を更新しようとしているか? (更新対象のid)が抜け落ちています。 それを含めて更新する必要があると思います。 私なら <td><input class="form-control" name="receive_message_1[{{$Message->id}}]" value='{{$Message->receive_message_1}}'></td> とし foreach ($request->receive_message_1 as $message_id => $value) { $message = Message::find($message_id); $message->receive_message_1 = $request->receive_message_1[$message_id]; $message->receive_message_2 = $request->receive_message_2[$message_id]; $message->receive_message_3 = $request->receive_message_3[$message_id]; $message->save(); } のような感じで対応します
kentooooo

2019/11/13 09:32

勉強になります。ありがとうございます 現在夜勤中でして、また明日試してみようと思います。 またお返事書かせてやって下さい。
kentooooo

2019/11/13 18:07

夜勤中にこっそりと失礼します。 教えていただいた方法で、無事updateできるようになりました! リソースコントローラーが便利なので、何も考えずに使っていたのがよくなかったです。 もっと基礎の部分を勉強しないといけないなと思わされた次第です。 本当にありがとうございました!
guest

回答1

0

ベストアンサー

ほぼコメント欄で解決しましたが一応回答を書いておきます。

updateで複数のレコードを対象に更新しているように見えますが
リソースコントローラでは、特定の(引数に入ってくるモデルのインスタンス)レコードに対しての
操作を想定しています。
一括アップデート用に新しくメソッドとルートを追加するのが良いでしょう

また、現在の内容では、どのレコードを更新するかというのが明確に書かれていないのも
(通常はid等で条件を絞って更新する)
うまくいかない要因かと思われます。

投稿2019/11/14 06:47

mikkame

総合スコア5036

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

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

kentooooo

2019/11/14 07:57

本当にありがとうございました。 これからも勉強を続けていきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問