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

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

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

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

11031閲覧

Laravel belongsToでリレーションした主テーブルのプロパティが取得できない

stadmlmg

総合スコア12

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2018/03/29 14:21

お世話になります。

laravel・php素人です。
WPを少し扱っていましたが、簡単なテンプレートを作成できるくらいでphpの知識も浅いです。
(クラスなどの概念もlaravelを使用しはじめて初めて触れました)

質問自体うまくできていない可能性があり大変恐縮なのですが、ご教授いただけるとありがたいです。

laravel5.5
php7
xamppを用いてローカルで開発しています。

前提・実現したいこと

belongsTo結合で主テーブルのデータを取得し、従テーブルのモデルクラスのメソッドの返り値としてreturnするメソッドを作成したが、
viewでエラーが発生してしまう。

php

1【主テーブル:service】 2id 3state 4shop_id 5category_id 6name

php

1【従テーブル:service_faqs】 2id 3service_id 4faq_number 5question 6answer
【モデルクラス:Service.php】 namespace App; use Illuminate\Database\Eloquent\Model; class Service extends Model { // protected $guarded = [ 'id', ]; }

php

1【モデルクラス:Service_faqs.php】 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6 7class Service_faq extends Model 8{ 9 // 10 11 protected $guarded = [ 12 'id', 13 ]; 14 15 public function service() { 16 return $this->belongsTo('App\Service'); 17 } 18 19 public function getServiceName() { 20 return $this->service->name; 21 } 22 23 24}

php

1【TestController.php】 2 3namespace App\Http\Controllers\test; 4 5use Illuminate\Http\Request; 6use App\Http\Controllers\Controller; 7 8use App\Service; 9use App\Service_faq; 10 11class TestController extends Controller 12{ 13 // 14 public function get() 15 { 16 $services = Service::all(); 17 $service_faqs = Service_faq::all(); 18 19 $param = [ 20 'services' => $services, 21 'service_faqs' => $service_faqs 22 ]; 23 24 return view('test.index',$param); 25 } 26}

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

view出力時の該当部分のコードは下記のとおりです

php

1【test.blade.php】 2@foreach( $service_faqs as $service_faq ) 3 <tr> 4 <td>{{ $service_faq->id }}</td> 5 <td>{{ $service_faq->service_id }}</td> 6 <td>{{ $service_faq->faq_number }}</td> 7 <td>{{ $service_faq->question }}</td> 8 <td>{{ $service_faq->answer }}</td> 9 <td> 10 {{ $service_faq->getServiceName() }} 11 </td> 12 </tr> 13@endforeach

上記コードでService_faqsモデルに作成したgetServiceName()メソッドで、主テーブルのnameが出力できると思ったのですが、
下記エラーが発生してしまいました。

Trying to get property of non-object

試したこと

service_faqsモデルでreturnする前の値を確認するため、モデル内でダンプし、return前に処理を止めてみたところ、正常に出力できました。

【Service_faqs.php】 namespace App; use Illuminate\Database\Eloquent\Model; class Service_faq extends Model { // protected $guarded = [ 'id', ]; public function service() { return $this->belongsTo('App\Service'); } public function getServiceName() { var_dump($this->service->name); exit(); // 確認のためdumpして処理を停止 return $this->service->name; }

php

1【出力結果】 2string(54) "サービス名"

しかしながらexitをコメントアウトし、viewまで処理が通るようにするとエラーが起きてしまいます。

色々試してみて、連想配列のキーで指定すると何故かうまくいきました。

php

1【Service_faqs.php】 2namespace App; 3 4use Illuminate\Database\Eloquent\Model; 5 6class Service_faq extends Model 7{ 8 // 9 10 protected $guarded = [ 11 'id', 12 ]; 13 14 public function service() { 15 return $this->belongsTo('App\Service'); 16 } 17 18 public function getServiceName() { 19 return $this->service['name']; //←viewで正常に出力可能 20 } 21 22 23}

$this->serviceの中身を確認しましたが、dumpの結果も、gettypeの結果もobjectでした。

php

1【dump結果】 2 3object(App\Service)#497 (26) { 4 ["guarded":protected]=> 5 array(1) { 6 [0]=> string(2) "id" 7 } 8 ["connection":protected]=> 9 string(5) "mysql" ["table":protected]=> NULL 10....省略.... 11 12【gettype結果】 13 public function getServiceName() { 14 echo gettype($this->service); //←実行結果 object 15 exit(); 16 return $this->service['name']; 17 } 18

なぜobjectなのにアロー演算子でエラーになってしまうのか不明です。

乱文で大変申し訳ないです。
どなたかお力添えいただけると幸いです。

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

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

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

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

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

guest

回答2

0

getServiceNameという面倒なことをしなくても、Model->定義したリレーション->欲しいプロパティで必要な情報が取れると思います。
参考サイト
というわけで、下記の通りにview側を変更してみては如何でしょうか?

<td> {{ $service_faq->service->name }} </td>

もしくは、別にメソッドとして定義したい理由があるのでしょうか?

投稿2018/04/02 01:59

編集2018/04/02 02:15
motuo

総合スコア3027

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

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

stadmlmg

2018/04/02 02:13

ご回答ありがとうございます。 仰る通りなのですが、入門書を読んで同じことをしている(つもり)のですが、 同じ挙動にならずに疑問に思い質問させていただきました。 実際には全く同じコードではなく、当方の環境に合わせてコードを書いており、 入門と全く同様の写経したときには予想通りの出力ができました。 恐らく自分が何かミスしているのだと思います。。。 ※具体的にはPHPフレームワークLaravel入門(掌田 津耶乃 初版) 該当箇所はP273を再現しようとしています ご提示いただいたURLが404でしたが、こちらでよろしいでしょうか? https://readouble.com/laravel/5.5/ja/eloquent-relationships.html もう少しきちんとリファレンスを熟読してみます。 ありがとうございました。
motuo

2018/04/02 04:08

すいません。リンクが間違えていましたね…直しましたが、リンク先はそれでOKです。 ちなみにですが、dd($this->service)とするとnullだったりしませんかね? nullではない場合、オブジェクトの中が見えるかもしれないので、そちらも確認してみてください。
guest

0

ベストアンサー

EloquentモデルにDBデータ以外のものを取得できるようにするには、アクセサあたりの知識を深めてみて下さい。
Laravel 5.5 Eloquent:ミューテタ アクセサの定義

投稿2018/04/01 13:57

aro10

総合スコア4106

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

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

stadmlmg

2018/04/02 06:17

ご回答ありがとうございます。 そもそもURLで教えて頂いた「アクセサとミューテタ」というものの概念すら理解しておりませんでした。完全にリファレンスの読み込み不足ですね。。。反省です。 きちんと確認させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問