前提・実現したいこと
laravel7.28で、記事:親の詳細ページ(product)に関連記事:子(post)を一覧表示させたいです
productは、複数のpostをもつ一対多
親のidごとに表示させたいため、ProductsControllerのshowメソッドを使用
bladeの表示でエラーが出てしまいます。アドバイスいただけると幸いです
エラーメッセージ
Undefined variable: posts (View:/projects/resources/views/pages/products/show.blade.php)
該当のソースコード
ProductsController.php
php
1<?php 2namespace App\Http\Controllers; 3use Illuminate\Http\Request; 4use Illuminate\Support\Facades\Auth; 5// 追加 6use Validator; 7use App\Product; 8use App\Post; 9 10class ProductsController extends Controller 11{ 12 /** 13 * Display the specified resource. 14 * @param int $id 15 * @return \Illuminate\Http\Response 16 */ 17 public function show($id) 18 { 19 $product = Product::find($id); 20 // posts table 取得 主→従 21 $post = $product->posts; 22 // $post = Product::find($id)->posts; 23 // dd($post); collectionで取得できる 24 return view('pages.products.show', compact('product', 'post')); 25 } 26} 27
show.blade.php
php
1@extends('layouts.app') 2@section('content') 3 4<section> 5 <!-- 親記事の情報 --> 6 <p>{{ $product->id }}</p> 7 <p>{{ $product->product_name }}</p> 8 9 <!-- 関連記事(子記事)一覧 --> 10 @foreach($posts as $post) 11 {{$post->id}} 12 {{$post->posts_name}} 13 @endforeach 14</section> 15@endsection
Product.php
php
1namespace App; 2use Illuminate\Database\Eloquent\Model; 3class Product extends Model 4{ 5 // 6 protected $fillable = [ 7 'product_user_id', 8 'posts_products_id' 9 ]; 10 11 //relation 1対1 12 public function user() 13 { 14 return $this->belongsTo('App\User', 'product_user_id', 'id'); 15 } 16 //relation 1対多 17 public function posts() 18 { 19 return $this->hasMany('App\Post', 'posts_products_id', 'id'); 20 } 21} 22
Post.php
php
1namespace App; 2use Illuminate\Database\Eloquent\Model; 3 4class Post extends Model 5{ 6 //relation 1対1 7 public function product() 8 { 9 return $this->belongsTo('App\Product'); 10 } 11}
試したこと
最初はこちらと同じエラーが表示されたため、参考にさせていただいたのですが、
上記のエラーが出て解決できませんでした
https://teratail.com/questions/89958?link=qa_related_pc_sidebar
show.blade.php
php
1//データ取得できる Illuminate\Database\Eloquent\Collection で表示できる 2@php 3 dd($post); 4@endphp 5//データ取得できる 2と表示される 6{{$posts->count()}} 7 8//エラー発生する 9{{$posts->id}}
tinker
$ php artisan tinker >>> $c = App\Product::find(3)->posts->count(); => 2 >>> $c = App\Product::find(3)->posts; => Illuminate\Database\Eloquent\Collection {#4154 all: [ App\Post {#4158 id: 13, posts_products_id: 3, posts_name: "子記事1", posts_cap: "テキストテキスト", created_at: "2020-11-10 17:09:42", updated_at: "2020-11-10 17:09:42", }, App\Post {#4176 id: 14, posts_products_id: 3, posts_name: "子記事2", posts_cap: "テキストテキスト", created_at: "2020-11-10 17:09:42", updated_at: "2020-11-10 17:09:42", }, ], } >>> $c = App\Product::find(3)->posts->id; Exception with message 'Property [id] does not exist on this collection instance.'
補足情報
・テーブル products / posts(postsにforeignkey設定済)
・モデル Product.php / Post.php
・コントローラ ProductsController.php
・laravel 7.28.4
・mysql Ver 14.14
・PHP 7.4.10
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/15 01:38