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

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

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

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

PHP

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

Q&A

解決済

1回答

1170閲覧

belongTo()が?正常に動作しない

torimingo

総合スコア122

Laravel

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

PHP

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

0グッド

0クリップ

投稿2020/10/15 11:48

Laravel初心者の初心者です。
Laravel入門(第2版)という有名な本で勉強しているのですが、
belong To結合がうまくいきません。

http://localhost/laravel_app/public/boardにアクセスすると以下のエラーがでます。

ErrorException Trying to get property 'name' of non-object (View: /opt/lampp/htdocs/laravel_app/resources/views/board/index.blade.php) Illuminate\Foundation\Bootstrap\HandleExceptions::handleError app/Models/Board.php:21

主なソースコードは以下です。

Board.php

board.php

1<?php 2 3namespace App\Models; 4 5use Illuminate\Database\Eloquent\Factories\HasFactory; 6use Illuminate\Database\Eloquent\Model; 7 8class Board extends Model 9{ 10 protected $guarded = array('id'); 11 12 public static $rules = array( 13 'person_id' => 'required', 14 'title' => 'required', 15 'message' => 'required' 16 ); 17 18 public function getData() 19 { 20 // ★★★★★ここでnameが参照できないといっている? 21 return $this->id . ': ' . $this->title . '(' 22 . $this->person->name . ')'; 23 } 24 25 public function person() 26 { 27 return $this->belongsTo('App\Models\Person'); 28 } 29}

Person.php

person.php

1<?php 2 3namespace App\Models; 4 5use Illuminate\Database\Eloquent\Factories\HasFactory; 6use Illuminate\Database\Eloquent\Model; 7use Illuminate\Database\Eloquent\Builder; 8use App\Scopes\ScopePerson; 9 10class Person extends Model 11{ 12 protected $guarded = array('id'); 13 14 public static $rules = array( 15 'name' => 'required', 16 'mail' => 'email', 17 'age' => 'integer|min:0|max:150' 18 ); 19 20 public function getData() 21 { 22 return $this->id . ': ' . $this->name . ' (' . $this->age . ')'; 23 } 24 25 public function boards() 26 { 27 return $this->hasMany('App\Models\Board'); 28 } 29}

どこがおかしいのかわかる方いらっしゃいませんでしょうか?

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

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

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

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

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

m.ts10806

2020/10/15 11:57

> Laravel初心者の初心者です。 「初心者アイコン」を質問本文につけるにとどめてください。 >Laravel入門(第2版)という有名な本で 重用者の中では悪い意味で有名ですね。teratailでも良い意見はききません。 > http://localhost/laravel_app/public/boardに URLがこれの時点で、導入部分ができてません。 https://readouble.com/laravel/8.x/ja/installation.html#configuration 書籍と自身の環境のバージョンが合っていないとなんの参考にもならないのですが、 そのあたりは如何ですか?
torimingo

2020/10/15 12:11

>>URLがこれの時点で、導入部分ができてません。 belongTo結合は書籍の後半に記載があるのですが、 belongTo結合を実施する前までは、普通に動作していました。 書籍のバージョンに合わせたつもりです〜。
kai0310

2020/10/15 12:14

> 書籍のバージョンに合わせたつもりです〜。 〜のつもりが原因で発生する弊害は山ほどありますので確認してください。 コードを見た感じではAppの下にModelsがあるので8.xなのではないでしょうか?とてもじゃないですがまだ8系のバージョンに対応した 書籍は店頭で売られてはいないと思いますが、、
m.ts10806

2020/10/15 12:15

ですから、正しいルートの指定ができてないので、「導入部分が」と書きました。 本当に書籍のままなら、全く実用的ではないので、その書籍はやめたほうが良いです(人によっては「捨てるところから始めて」と言う人もいますよ) リニューアルでどれだけ改善されたのかは知らないのですが、「書籍は執筆時点では最新でも刊行した時点では古くなっている」ということは認識しておいた方が良いです。
torimingo

2020/10/15 12:20

>コードを見た感じではAppの下にModelsがあるので8.xなのではないでしょうか? 書籍とlaravelのバージョンが異なっていました。 書籍はlaravel6で、自分の環境は8.8でした。 環境8.8で上記の問題は解決できないでしょうか?
kai0310

2020/10/15 12:24

バージョンによって勿論仕様等も変わってきます。 詳しくはバージョンごとの変更点を調べていけばわかるはず。
torimingo

2020/10/15 12:35

調べてみます〜 ありがとうございます
kai0310

2020/10/15 12:44

端的にいえば書き方も多少変わってくるということです。すでに指摘がある様ですが、その書籍をみて進めていく以上その書籍と同じバージョンにするべきですね。 このやりとりを見る感じDocもあまり参照していない様ですからバージョンアップ後のコードに変更するのは厳しいかと思いますよ。8.xからはModelの配置も変わってきていますし。
kawax

2020/10/15 12:46

たぶんそのLaravel本だと思うけど「Laravel6対応版」を実際に自分で読んでみたら中身はそんなに間違ってなかった。それでもその本を読んだ人はなぜか意味不明な使い方をする。読者側に最低限必要な知識が足りてないんだろうという結論しかなかった。Laravelの前にPHPはもちろんwebに関する幅広い学習が必要。Laravel使う前に知ってて当然の常識は「Laravel入門者向けの本」では省略される。
torimingo

2020/10/15 13:11

「$this->person->name;」を 「$this->person()->first();」に変えたらとりあえず、エラーは出なくなった。 なぜかはわからない・・・泣
m.ts10806

2020/10/15 13:17

改めて環境構築のところからドキュメント確認してください。 あと、「Web職人のためのフレームワーク」という前提は忘れないほうが良いです。 既に指摘がありますし、teratailの質問でも再三でている指摘ですが、teratailで質問する人の多くがLaravelを利用する段階にないです。 PHPの基本部分、Webの概念 一通りそろってないと使いこなせるようにはなりませんし、書籍も無駄になると思います。
torimingo

2020/10/15 14:29

質問の回答教えてくださいな?
m.ts10806

2020/10/16 13:27

結局バージョンはどうしたのでしょうか。コメントからは結局どうしたのか分かりません。 前提が合わないなら答えようがない部分はありますよ。 8で解決したいようですが5.8のドキュメントを参照していますし。 8でいきたいなら書籍は参考になりません。5.8でいきたいならそもそも5.8で入れなおさなければなりません。
torimingo

2020/10/16 13:50

「$this->person->name」を 「$this->person()->get('name')->pluck('name')」に変えたら、 ["Taro"]が返ってくるようになったが、Taroだけ返したい もう少し
guest

回答1

0

自己解決

Board.phpのgetData()の「$this->person->name」を「$this->person()->get('name')->pluck('name')->first()」に修正したら、とりあえず解決しました。正しいかどうか、効率がいいかどうかはわかりませんが。
Personモデル(テーブル?)のnameを得ることができました。
collectionやenumerableなど、よくわかりませんでしたが、以下のマニュアル読んだらできました。
https://laravel.com/api/master/index.html

投稿2020/10/16 22:52

torimingo

総合スコア122

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問