お世話になります。
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なのにアロー演算子でエラーになってしまうのか不明です。
乱文で大変申し訳ないです。
どなたかお力添えいただけると幸いです。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/02 02:13
2018/04/02 04:08