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

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

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

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

Laravel

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

PHP

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

Q&A

0回答

832閲覧

Laravel 「"Attempt to read property " " on null."」を解決したい

watayuri_a

総合スコア0

MySQL

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

Laravel

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

PHP

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

0グッド

0クリップ

投稿2023/05/24 23:46

実現したいこと

productsテーブルのcompany_idを外部キーとして、紐づいたcompany_nameをcompaniesテーブルから取得し表示させたい。

前提

Laravelで管理システムを作っています。
商品一覧画面のメーカー名(company_name)を表示させたいのですが、実装中に以下のエラーメッセージが発生しました。

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

Attempt to read property "company_name" on null(index.blade.phpの30行目)

該当のソースコード

index.blade.php

1<x-layout> 2 <x-slot name="title"> 3 商品情報一覧 4 </x-slot> 5 <div class="Container"> 6 <h1>商品情報一覧</h1> 7 <div class="FormGroup"> 8 <a href="{{route('posts.create')}}"> <button type="button">新規登録</button></a> 9 <form action="{{route('posts.index')}}" method="GET"> 10 @csrf 11 12 <input type="text" name="keyword" value="{{ $keyword }}"> 13 <select> 14 @foreach ($posts as $post) 15 <option>{{$post->company_id}}</option> 16 @endforeach 17 </select> 18 <input type="submit" value="検索"> 19 </form> 20 </div> 21 <div class="ListItems"> 22 <ul> 23 @forelse ($posts as $post) 24 <li> 25 <label>ID</label>{{$post->id}} 26 <label>商品名</label>{{$post->product_name}} 27 <label>価格</label>{{$post->price}} 28 <label>在庫数</label>{{$post->stock}} 29 <label>画像</label>{{$post->img_path}} 30 <label>メーカー名</label>{{$post->products->company_name}} 31 <a href="{{route('posts.show', $post)}}"><button type="button">詳細</button></a> 32 <form method="post" action="{{route('posts.destroy', $post)}}" onclick='return confirm("削除しますか?")'> 33 @method('DELETE') 34 @csrf 35 36 <button>削除</button> 37 </form> 38 </li> 39 @empty 40 <li>商品はありません</li> 41 @endforelse 42 </ul> 43 </div> 44 </div> 45</x-layout> 46

PostController.php

1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6use App\Models\Product; 7use App\Models\Company; 8 9class PostController extends Controller 10{ 11 public function index() { 12 // $posts = product::latest()->get(); 13 $posts = Product::all(); 14 $company = Company::all(); 15 16 return view('index') 17 ->with(['posts' => $posts]); 18 } 19 20 public function search(Request $request) { 21 $keyword = $request->input('keyword'); 22 $query = Product::query(); 23 24 if(!empty($keyword)) { 25 $query->where('product_name', 'LIKE', "%{$keyword}%"); 26 } 27 28 $posts = $query->get(); 29 30 return view('index', compact('posts', 'keyword')); 31 } 32 33 public function show($id) { 34 $post = Product::findOrFail($id); 35 36 return view('posts.show') 37 ->with(['post' => $post]); 38 } 39 40 public function create() { 41 return view('posts.create'); 42 } 43 44 public function store(Request $request) { 45 $request->validate([ 46 'product_name' => 'required', 47 'price' => 'required', 48 'stock' => 'required', 49 ], [ 50 'product_name.required' => '商品名は必須です', 51 'price.required' => '価格は必須です', 52 'stock.required' => '在庫数は必須です', 53 ]); 54 55 $post = new product(); 56 $post->product_name = $request->product_name; 57 $post->price = $request->price; 58 $post->stock = $request->stock; 59 $post->comment = $request->comment; 60 $post->company_id = $request->company_id; 61 $post->save(); 62 63 64 return redirect() 65 ->route('posts.index'); 66 } 67 68 public function edit($id) { 69 $post = product::findOrFail($id); 70 71 return view('posts.edit') 72 ->with(['post' => $post]); 73 } 74 75 public function update(Request $request, $id) { 76 $request->validate([ 77 'product_name' => 'required', 78 'price' => 'required', 79 'stock' => 'required', 80 ], [ 81 'product_name.required' => '商品名は必須です', 82 'price.required' => '価格は必須です', 83 'stock.required' => '在庫数は必須です', 84 ]); 85 86 $post = new product(); 87 $post->product_name = $request->product_name; 88 $post->price = $request->price; 89 $post->stock = $request->stock; 90 $post->comment = $request->comment; 91 $post->save(); 92 93 return redirect() 94 ->route('posts.show', $post); 95 } 96 97 public function destroy($id) { 98 $post = product::findOrFail($id); 99 $post->delete(); 100 101 return redirect() 102 ->route('posts.index'); 103 } 104} 105

Product.php

1<?php 2 3namespace App\Models; 4 5use Illuminate\Database\Eloquent\Factories\HasFactory; 6use Illuminate\Database\Eloquent\Model; 7 8class Product extends Model 9{ 10 use HasFactory; 11 12 public function companies() { 13 return $this->belongsTo(Company::class); 14 } 15 16 protected $fillable = [ 17 'product_name', 18 'price', 19 'stock', 20 'comment', 21 'img_path', 22 'company_id', 23 ]; 24} 25

Company.php

1<?php 2 3namespace App\Models; 4 5use Illuminate\Database\Eloquent\Factories\HasFactory; 6use Illuminate\Database\Eloquent\Model; 7 8class Company extends Model 9{ 10 use HasFactory; 11 12 public function products() { 13 return $this->hasMany(Product::class); 14 } 15 16 protected $fillable = [ 17 'company_name', 18 'street_address', 19 'representative_name', 20 ]; 21} 22

試したこと

該当コードの末尾に「??'該当なし'」と付け加えるとエラーは改善されました。
しかし、productsテーブルのcompany_idカラムとcompaniesテーブルのcompany_nameカラムにはそれぞれデータが入力されているはずなのに、すべて「該当なし」と表示されてしまいます。新しくレコードを追加してみても結果は変わりませんでした。

以上、ご教授いただけたら幸いです。よろしくお願いいたします。

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

Laravel10

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問