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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

Eloquent

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

Q&A

解決済

1回答

9541閲覧

[laravel]リレーション したデータをbladeで表示できない

mori_samidori

総合スコア2

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

Eloquent

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

0グッド

0クリップ

投稿2020/11/14 17:20

編集2020/11/14 17:29

前提・実現したいこと

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

単純にpostとpostsの間違いでは。

$post = $product->posts;
@foreach($posts as $post)

コントローラーでpostsを渡す必要もなくこれでいいと思うけど。

@foreach($product->posts as $post)

投稿2020/11/14 23:58

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

mori_samidori

2020/11/15 01:38

ありがとうございます!解決できました。 ご指摘いただいた通りコントローラで値渡さなくても表示もできました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問