前提・実現したいこと
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
回答1件
あなたの回答
tips
プレビュー