参考書籍:
「PHPフレームワークLaravel入門第2版」
環境:
mac
Laravel Framework 6.18.42
PHP 7.3.11
下記の通りBoardモデルにてpeopleテーブルとのリレーションを記述していますが、
getDataメソッドの
$this->person->name
の部分が認識されず、
Trying to get property 'name' of non-objectとのエラー表示になります。
$this->person->nameの部分を
$this->person
とすると、personのレコードが配列で表示されるので、
->name
の部分に問題があるのかと考えましたが、
personモデルにてBoarsテーブルとのリレーションを記述して同様のgetDataメソッドを呼び出すとエラーなく表示されます。
どこが原因で上記エラーが発生しているかが不明です。
以下関係するコードを載せます。
<Boardモデル>
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Board extends Model { public function person(){ return $this->belongsTo('App\person'); } public function getData(){ return $this->id.': '.$this->title.' ('.$this->person->name.')'; } // }
<Boardコントローラ>
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Board; class BoardController extends Controller { public function index(Request $request){ $items = Board::all(); return view('board.index', ['items'=> $items]); }
<Board.indexビュー>
@extends('layouts.helloapp') @section('title', 'Board.index') @section('menubar') @parent ボードページ @endsection @section('content') <table> <tr> <th> Data </th> </tr> @foreach($items as $item) <tr> <td> {{$item->getData()}} </td> </tr> @endforeach </table> @endsection @section('footer', 'copyright 2020 tuyano.')
<personモデル>
<?php namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Builder; use App\Scopes\ScopePerson; class Person extends Model { public function getData(){ return $this->id.':'.$this->name.'('.$this->age.')'; } public function boards(){ return $this->hasMany('App\Board'); } }
<personコントローラ>
<?php namespace App\Http\Controllers; use App\Person; use Illuminate\Http\Request; class PersonController extends Controller { public function index(Request $request){ $items = Person::all(); return view('person.index', ['items'=> $items]); } }
<person.indexビュー>
@extends('layouts.helloapp') @section('title', 'Person.index') @section('menubar') @parent インデックスページ @endsection @section('content') <table> <tr> <th> Data </th> <th> Board </th> </tr> @foreach($items as $item) <tr> <td> {{$item->getData()}} </td> <td> @if ($item->boards != null) <table width="100%"> @foreach($item->boards as $obj) <tr> <td> {{$obj->getData()}} </td> </tr> @endforeach </table> @endif </td> </tr> @endforeach </table> @endsection @section('footer', 'copyright 2020 tuyano.')
以上です。
ご教示いただけます幸いです。
よろしくお願いいたします。
以下追記です。
<Board.indexビュー>にてddを追加しました。
@foreach($items as $item) <tr> <td> {{dd($item->person)}} {{$item->getData()}} </td> </tr> @endforeach
となります。(デバックの経験が浅く、ddの使い方が正しいかどうかわかりませんが。。)
回答1件
あなたの回答
tips
プレビュー