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

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

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

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

Q&A

解決済

2回答

6211閲覧

Laravel5.7系で「Invalid argument supplied for foreach()」のエラーが消えない

amaturePy

総合スコア131

Laravel

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

0グッド

0クリップ

投稿2020/02/09 04:10

EC2内でLaravel5.7系で開発を行っております。
そこで、基本的なCRUD機能の一つである編集機能(edit アクション)のなかで上記エラーが出ます。
このエラーを見る限り、うまくDBからデータの取得ができていと踏んでます。
他テーブルでの同機能は実現できています。
editアクションでは引数にある(ProductBrand $product_brand)で該当テーブルのモデル情報を取得してビュー側に渡しています。
DB内データの日本語に関しても文字化けなどもしていないため、idの取得の障害になる要因は見受けられません。
解決方法に関して「ここが怪しいのでは?」というアドバイスがありましたらお教え頂けると幸いです。
【対象テーブル】
product_brandsテーブル
id | name
1 | 資◯堂
2 | D◯C
ーーーーーーー

edit.blade.php @extends('layouts.app') @section('content') <div class="container"> <div class="row justify-content-md-center"> <div class="col-6"> <nav aria-label="breadcrumb"> <ol class="breadcrumb"> <li class="breadcrumb-item"> <a href="{{ action('ProductBrandController@index', ['id'=>$product_brand->id])}}">ブランド</a> </li> <li class="breadcrumb-item active" aria-current="page"> <a href="{{ action('ProductBrandController@show', ['id'=>$product_brand->id])}}"> {{ $product_brand->name }} </a> </li> <li class="breadcrumb-item active" aria-current="page">編集</li> </ol> </nav> <form action="{{ url('product_brands/'. $product_brand->id) }}" method="post" class="form-group"> @csrf @method('PUT') {{ Form::label('name', 'ブランド名', ['class' => 'mt-3']) }} {{ Form::select('name', $product_brand->name, null, ['class' => 'form-control']) }} <div class="mt-3">{{ Form::submit('更新', ['class' => 'btn btn-primary px-5']) }}</div> </form> </div> </div> </div> @endsection
ProductBrandController.php public function edit(ProductBrand $product_brand) { return view('product_brands/edit', ['product_brand' => $product_brand]); }
Routes Route::resource('product_brands','ProductBrandController'); コード

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

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

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

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

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

guest

回答2

0

ベストアンサー

そこで、基本的なCRUD機能の一つである編集機能(edit アクション)のなかで上記エラーが出ます。

このエラーを見る限り、うまくDBからデータの取得ができていと踏んでます。

こちらの予測の根拠が薄い様に思えます。
Invalid argument supplied for foreach の意味は、foreachにnullやobject、stringなど
イテレーター(配列)ではないものを渡した時に発生するエラーです。
仮に、DBからデータが取得できない(存在しないIDを指定した時等)は404エラーになります。
controllerでも、viewでもforeachが使われていないので他の箇所に原因が潜んでいると思われます。
そのために、エラーメッセージにはどのファイルの何行目バックトレースが含まれているはずです。
まずはどのファイルの何行目バックトレースで具体的にどこがおかしいのかを確認してみてはどうでしょうか?


追記です

{{ Form::select('name', $product_brand->name, null, ['class' => 'form-control']) }}

このForm::selectに渡している nullが原因では?
ここは、optionの選択肢が入るため、イテレータ(配列)を入れないといけない気がします。
nullを入れた結果、foreachでこけているのでは?

投稿2020/02/09 05:07

編集2020/02/09 05:10
mikkame

総合スコア5036

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

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

退会済みユーザー

退会済みユーザー

2020/02/09 05:31

> このForm::selectに渡している nullが原因では? 第2引数の$product_brand->nameが原因では? 第2引数はarray や collection である必要があります。
mikkame

2020/02/09 05:35

第二引数がオプションで第三がデフォルトでしたっけ? アシストありがとうございます!
退会済みユーザー

退会済みユーザー

2020/02/09 05:39

> 第二引数がオプションで第三がデフォルトでしたっけ? ですです
amaturePy

2020/02/09 07:40 編集

ありがとうございます。 エラーの箇所は/var/www/html/site/vendor/laravelcollective/html/src/FormBuilder.php でformbuilderのforeachで出ています。 また、nullも外してはみたのですが、同様のエラーが出てる状態です。 "Invalid argument supplied for foreach() (View: /var/www/html/site/resources/views/product_brands/edit.blade.php)" 引数がおかしいと出てるのかなと。
mikkame

2020/02/09 07:48

とりえあず > {{ Form::select('name', $product_brand->name, null, ['class' => 'form-control']) }} これを > {{ Form::select('name', [], product_brand->name, ['class' => 'form-control']) }} こうしてください
amaturePy

2020/02/09 08:06

ありがとうございました! 頂いた物で実装できました。 []で配列を渡すのですね。 勉強になりました。 他のテーブルでは上のnullのある物で実装できたので、疑問が残りますが、 調べてみます。
mikkame

2020/02/09 08:11

引数の順番を確認してみてください。 name,選択肢の配列,デフォルト値,属性 の順番です
guest

0

php

1Route::resource('product_brands','ProductBrandController');

php

1Route::resource('product_brands/{product_brand}','ProductBrandController');

投稿2020/02/09 04:12

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

mikkame

2020/02/09 05:08

resourceなので暗黙的バインディングで自動的に{product_brand}は入ります。 ご指摘のように修正すると product_brands/1/1/edit みたいな感じになってしまうかと
退会済みユーザー

退会済みユーザー

2020/02/09 05:10 編集

あ、resource  使ってた・・・ その通りですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問