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

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

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

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

Laravel 5

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

Q&A

解決済

1回答

4574閲覧

laravelで画像ファイルのパスを取得したい。

ckts

総合スコア7

PHP

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

Laravel 5

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

0グッド

0クリップ

投稿2017/12/10 14:01

###前提・実現したいこと
サムネイル付き投稿ができる掲示板のようなものを作ってみたいと考えています。
PostモデルにThumbnailモデルを1対1のリレーションで結んで、PostモデルからThumbnailモデルを管理するテーブルに保存してあるpathを取得したいのですが、うまくいきいません

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

php

1Call to a member function getPath() on null (View: /home/vagrant/practice/resources/views/posts/posts.blade.php) (View: /home/vagrant/practice/resources/views/posts/posts.blade.php)

###該当のソースコード
posts.blade.php

php

1<div class="post-area"> 2 <ul> 3 @if(count($posts) > 0) 4 @foreach($posts as $post) 5 <?php $post_user = $post->user; 6 $post_thumbnail_path = $post->thumbnail()->getResults()->getPath(); 7 ?> 8 <li class="post-list"> 9 <div class="post"> 10 <div class="post-header"> 11 <img src="{{asset("$post_thumbnail_path")}}" class="post-thumbnail"> 12 <h2>{{$post->title}}</h2> 13 </div>

Post.php

php

1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6 7class Post extends Model 8{ 9 // 10 protected $table = 'posts'; 11 protected $fillable = ['title','content','attribution']; 12 13 public function user(){ 14 return $this->belongsTo(User::class); 15 } 16 17 public function thumbnail(){ 18 return $this->hasOne('App\PostThumbnail'); 19 } 20} 21

PostThumbnail.php

php

1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6 7class PostThumbnail extends Model 8{ 9 // 10 protected $table = 'post_thumbnails'; 11 protected $fillable = ['path']; 12 13 public function thumbnail_post(){ 14 return $this->belongsTo('App\Post'); 15 } 16 17 public function getPath(){ 18 return $this->path; 19 } 20} 21

###試したこと

php artisan tinker

で以下のように試しうまくいきましたが、ブラウザで確認しようとすると冒頭のようなエラーが出ます。

php

1[vagrant@localhost practice]$ php artisan tinker 2Psy Shell v0.8.15 (PHP 7.1.12 — cli) by Justin Hileman 3>>> use App\Post 4>>> use App\PostThumbnail 5>>> $post = Post::find(8) 6=> App\Post {#778 7 id: 8, 8 user_id: 1, 9 title: "サムネイル実験", 10 content: "8回目!", 11 created_at: "2017-12-10 11:23:15", 12 updated_at: "2017-12-10 11:23:15", 13 } 14>>> $post->thumbnail()->getResults()->getPath() 15=> "images/1512904995@images.jpg"

tinkerではうまくpathの値が取得できるのはなぜでしょうか?
また、うまくブラウザで表示させるにはどうするべきでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

単純にそのエラーがでるPostに関連したThumbnailが存在しない(null)というエラーに見えます。Call to a member function getPath() on nullは「nullに対してgetPathというメンバメソッドを呼ぼうとしています」というエラーです。つまり、$post->thumbnail()->getResults()の戻り値がnullなだけです。

投稿2017/12/11 00:36

masaya_ohashi

総合スコア9206

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

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

ckts

2017/12/12 09:58

ご指摘の通り戻り値がnullだったのが原因でした! PostモデルとThumbnailモデルの数が合っていなかったのでエラーになっていたようです! 教えていただきありがとうございました!
masaya_ohashi

2017/12/13 00:15

あと、リレーションを組んでるならいちいちgetResults()を呼ばなくてもプロパティのように仮想的にアクセスできますよ。 $post->thumbnail->getPath() これはEloquentのModelクラスが__getメソッドをオーバーライドしてごちゃごちゃやってくれてるからです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問