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

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

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

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

PHP

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

Eloquent

Eloquentとは、PHPフレームワークのLaravelに最初から含まれているORM(Object-relational mapping:オブジェクト関係マッピング)です。

Q&A

解決済

1回答

2573閲覧

Laravel 連想配列でselectedを付けたい

m2B

総合スコア20

Laravel

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

PHP

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

Eloquent

Eloquentとは、PHPフレームワークのLaravelに最初から含まれているORM(Object-relational mapping:オブジェクト関係マッピング)です。

0グッド

0クリップ

投稿2020/08/29 09:47

編集2020/08/30 04:17

前提・実現したいこと

selectboxで選択した時に,selectedを付与したいです。
コレクション・モデル・連想配列がまだ理解が浅いため申し訳ないです。

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

post送信して,
データは入っているのですが、一番最初のidのデータしか入らないです。
dd($categories)の内容が

Illuminate\Database\Eloquent\Collection {#1253 ▼ #items: array:6 [▼ 0 => App\Category {#1254 ▼ #fillable: array:1 [▶] #connection: "mysql" #table: "categories" #primaryKey: "id" #keyType: "int" +incrementing: true #with: [] #withCount: [] #perPage: 15 +exists: true +wasRecentlyCreated: false #attributes: array:4 [▼ "id" => 1 "name" => "家電/スマホ/カメラ" "created_at" => null "updated_at" => null ] #original: array:4 [▶] #changes: [] #casts: [] #dates: [] #dateFormat: null #appends: [] #dispatchesEvents: [] #observables: [] #relations: [] #touches: [] +timestamps: true #hidden: [] #visible: [] #guarded: array:1 [▶] } 1 => App\Category {#1255 ▶} 2 => App\Category {#1256 ▶} 3 => App\Category {#1257 ▶} 4 => App\Category {#1258 ▶} 5 => App\Category {#1259 ▶} ] }

該当のソースコード

productsController

1public function new() 2 { 3 // $category = Category::where('id')->first(); 4 // $categories = Category::all(); 5     $categories = Category::pluck('name', 'id')->toArray(); 6 $allTagNames = Tag::all()->map(function($tag) { 7 return [ 8 'text' => $tag->name, 9 ]; 10 }); 11 return view('products.new', [ 12 'allTagNames' => $allTagNames, 13 'categories' => $categories, 14 ]); 15 } 16 17 public function create(ProductRequest $request, Product $product) 18 { 19 $product->title = $request->title; 20 $product->review = $request->review; 21 $product->user_id = $request->user()->id; 22 $product->category_id = $request->category()->id; 23 // $filename = $request->file('photo')->store('public'); 24 // $product->photo = str_replace('public', '', $filename); 25 // s3アップロード開始 26 $image = $request->file('photo'); 27 // バケットの`myprefix`フォルダへアップロード 28 $path = Storage::disk('s3')->put('myprefix', $image, 'public'); 29 // アップロードした画像のフルパスを取得 30 $product->photo = Storage::disk('s3')->url($path); 31 32 $product->save(); 33 34 // $request->category = $product->category() ; 35 36 $request->tags->each(function ($tagName) use ($product) { 37 $tag = Tag::firstOrCreate([ 38 'name' => $tagName, 39 ]); 40 $product->tags()->attach($tag); 41 }); 42 43 return redirect()->route('products.index'); 44 } 45

Blade

1<select name="category_id" class="c-form--control" id=""> 2 <option value="">選択してください</option> 3 @foreach ($categories as $item => $value) 4 <option value="{{ $item }}" @if(old('category_id') == $item) selected @endif >{{ $value }}</option> 5 {{-- <option value="{{$item}}" @if(old('id') == $categories['id']) selected @endif>{{$value['name']}}</option> --}} 6 @endforeach 7 </select>

Model

1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6 7class Product extends Model 8{ 9 protected $fillable = ['title', 'review', 'photo']; 10 11 public function user() 12 { 13 return $this->belongsTo('App\User'); 14 } 15 16 17 public function category() 18 { 19 return $this->belongsTo('App\Category'); 20 } 21}

ProductRequest

1<?php 2 3namespace App\Http\Requests; 4 5use Illuminate\Foundation\Http\FormRequest; 6 7class ProductRequest extends FormRequest 8{ 9 /** 10 * Determine if the user is authorized to make this request. 11 * 12 * @return bool 13 */ 14 public function authorize() 15 { 16 return true; 17 } 18 19 /** 20 * Get the validation rules that apply to the request. 21 * 22 * @return array 23 */ 24 public function rules() 25 { 26 return [ 27 'title' => 'required|max:30', 28 'review' => 'required|max:200', 29 // 'category_id' => 'required', 30 'tags' => 'json|regex:/^(?!.*\s).+$/u|regex:/^(?!.*/).*$/u', 31 ]; 32 } 33 34 public function attributes() 35 { 36 return [ 37 'title' => 'タイトル', 38 'review' => 'レビュー', 39 // 'category_id' => 'カテゴリー', 40 'tags' => 'タグ', 41 ]; 42 } 43 44 public function passedValidation() 45 { 46 $this->tags = collect(json_decode($this->tags))->slice(0, 5)->map(function($requestTag) { 47 return $requestTag->text; 48 }); 49 } 50} 51

試したこと

三項演算子を使って真偽値をとっています
dd($categories)を使って中身は入っていることは確認できたのですが、うまくデータが取得できなくて困っています。

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

Laravel 6.18
php 7.25

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

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

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

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

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

m.ts10806

2020/08/29 09:50

dd($categories)の結果をご提示ください。
m2B

2020/08/29 10:04 編集

すいませんでした。
m.ts10806

2020/08/29 09:59

質問は編集できますので。 こちらに提示されても目につきませんしマークダウンが使えません
guest

回答1

0

ベストアンサー

selectのnameが'category'だから
選択した項目のvalueは'category'にセットされる。

php

1<option value="{{ $item }}" @if(old('category')==$item) selected @endif>{{ $value['name'] }}</option>

投稿2020/08/29 12:35

yuki84web

総合スコア1857

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

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

m2B

2020/08/30 04:23

ありがとうございます 修正しまして Controllerで $categories = Category::pluck('name', 'id')->toArray();で配列で取得してみました。 また、createで $product->category_id = $request->category()->id; を追加しています。 bladeは編集して上記に載せておきます。 formで入力してpost送信すると, Method App\Http\Requests\ProductRequest::category does not exist.のエラーが出てきました。 ProductRequestなど確認したのですが、解決できずにいます。 よろしくお願いします。
yuki84web

2020/08/31 02:00

selectのnameをcategory_idに変えたら、そのようなエラーになるのは当然です。 oldにはselectのnameを書き、比較検証するならばoptionのvalueを参照しなければなりません。 idで検証したいならvalueにidを出力して項目名にitemを出力すれば良いです。
m2B

2020/09/01 07:11

ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問