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

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

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

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

2回答

998閲覧

Laravel 詳細画面で画像を表示したい

hase07_prog

総合スコア1

Laravel

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2021/03/01 09:00

編集2021/03/01 09:43

前提・実現したいこと

PHP(Laravel7)で、献立アプリを作成しています。
一覧画面から詳細画面にアクセスし、詳細画面で各画像を表示したいです。

一覧画面ではforeachを使用して投稿された料理の画像が表示されるのですが、
詳細画面では料理名は表示されてるのですが、料理の画像が表示されません。

詳細画面⬇︎

![イメージ説明])

show($id)の$menuの中身

イメージ説明

該当のソースコード

Menucontroller.php

php

1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6 7use App\Models\Menu; 8use App\Http\Requests\StoreMenuForm; 9use Illuminate\Support\Facades\DB; 10 11class MenuController extends Controller 12{ 13 /** 14 * Display a listing of the resource. 15 * 16 * @return \Illuminate\Http\Response 17 */ 18 public function index() 19 { 20 // 21 // $menu = Menu::all(); 22 $menus = DB::table('menus') 23 ->select('cooking_name', 'cooking_image', 'id') 24 ->get(); 25 $today = date("Y-m-d H:i:s"); 26 return view('menu.index', compact('menus')); 27 } 28 29 /** 30 * Show the form for creating a new resource. 31 * 32 * @return \Illuminate\Http\Response 33 */ 34 public function create() 35 { 36 // 37 return view('menu.create'); 38 } 39 40 /** 41 * Store a newly created resource in storage. 42 * 43 * @param \Illuminate\Http\Request $request 44 * @return \Illuminate\Http\Response 45 */ 46 public function store(StoreMenuForm $request) 47 { 48 // 49 $menu = new Menu; 50 51 //画像ファイルのパス 52 $img_url = $request->cooking_image->store('public/upload'); 53 54 $menu->cooking_name = $request->input('cooking_name'); 55 $menu->cooking_image = str_replace('public/', 'storage/', $img_url); 56 57 $menu->save(); 58 59 return redirect('menu/'); 60 61 } 62 63 /** 64 * Display the specified resource. 65 * 66 * @param int $id 67 * @return \Illuminate\Http\Response 68 */ 69 public function show($id) 70 { 71 // 72 $menu = Menu::find($id); 73 return view('menu.show', compact('menu')); 74 } 75 76 /** 77 * Show the form for editing the specified resource. 78 * 79 * @param int $id 80 * @return \Illuminate\Http\Response 81 */ 82 public function edit($id) 83 { 84 // 85 } 86 87 /** 88 * Update the specified resource in storage. 89 * 90 * @param \Illuminate\Http\Request $request 91 * @param int $id 92 * @return \Illuminate\Http\Response 93 */ 94 public function update(Request $request, $id) 95 { 96 // 97 } 98 99 /** 100 * Remove the specified resource from storage. 101 * 102 * @param int $id 103 * @return \Illuminate\Http\Response 104 */ 105 public function destroy($id) 106 { 107 // 108 } 109} 110

show.blade.php

php

1@extends('layouts.app') 2 3@section('content') 4 <h1>{{ $menu->cooking_name }}</h1> 5 <img class="menu-image" src="{{ $menu->cooking_image }}" alt="{{ $menu->cooking_name }}"> 6@endsection

index.blade.php

php

1@extends('layouts.app') 2 3@section('content') 4<link rel="stylesheet" href="{{ asset('/css/index.css') }}"> 5 6<div class="container menu-page"> 7 <h1 class="menu-day">{{ \Carbon\Carbon::now()->format("Y/m/d") }}の献立</h1> 8 {{-- <h1>{{ $today }}</h1> --}} 9 <br> 10 <div class="menu-lists row"> 11 @foreach ($menus as $menu) 12 <div class="card menu-card" style="width: 18rem;"> 13 <a href="{{ route('menu.show', $menu->id) }}"> 14 <div class="menu"> 15 <svg class="bd-placeholder-img card-img-top" width="100%" height="0" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid slice" focusable="false" role="img" aria-label="Placeholder: Image cap"><title>Placeholder</title><rect width="100%" height="100%" fill="#868e96"/><text x="50%" y="50%" fill="#dee2e6" dy=".3em"><img class="menu-image" src="{{ $menu->cooking_image }}" alt="{{ $menu->cooking_name }}"></text></svg> 16 <div class="card-body"> 17 <p class="card-text">{{ $menu->cooking_name }}</p> 18 </div> 19 </div> 20 </a> 21 </div> 22 @endforeach 23 </div> 24 <div class="shopping-lists"> 25 26 </div> 27</div> 28 29@endsection

ルーティング

php

1<?php 2 3use GuzzleHttp\Middleware; 4use Illuminate\Support\Facades\Route; 5 6/* 7|-------------------------------------------------------------------------- 8| Web Routes 9|-------------------------------------------------------------------------- 10| 11| Here is where you can register web routes for your application. These 12| routes are loaded by the RouteServiceProvider within a group which 13| contains the "web" middleware group. Now create something great! 14| 15*/ 16 17Route::get('/', function () { 18 return view('welcome'); 19}); 20 21Auth::routes(); 22 23Route::get('/home', 'HomeController@index')->name('home'); 24 25Route::resource('menu', 'MenuController'); 26Route::group(['prefix' => 'menu', 'middleware' => 'auth'], function(){ 27 Route::get('/', 'MenuController@index')->name('menu.index'); 28 Route::get('create', 'MenuController@create')->name('menu.create'); 29 Route::post('store', 'MenuController@store')->name('menu.store'); 30 Route::get('show/{id}', 'MenuController@show')->name('menu.show'); 31});

バージョン

Laravel 7.30.4
PHP 7.4.9

長い文章になり申し訳ございません。
ご教授の程、宜しくお願い致します。

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

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

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

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

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

m.ts10806

2021/03/01 09:32

show($id)で得ている$menuをdd()で内容確認してみた結果を提示してください。 あとルーティングも提示してください。
hase07_prog

2021/03/01 09:45

m.ts 10806さん コメントありがとうございます。 ルーティングとddを使用して$menuの内容を追記しました! ご確認お願い致します。
guest

回答2

0

既存の回答で解決しそうなので私からはコードを見た感想を

  • LaravelにはせっかくEloquentという便利なORMがあるから使用する

(使用していない明確な根拠・意図があるのであれば良い)

  • 日時系はCarbonを利用する
  • バリデーションを通す

あたりを改善すると良いかとお思います。

投稿2021/03/01 17:06

編集2021/03/07 07:18
kai0310

総合スコア2070

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

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

hase07_prog

2021/03/07 05:58

kai0310さん、返信が遅くなり申し訳ありません。 ご指摘して頂きありがとうございます。 無事画像を表示することができました! バリデーションは、フォームリクエストバリデーションを使用して、バリデーションを通しています。 まだEloquentなど理解が浅いので、もう一度復習し直し、知識の定着をさせていきたいと思います! kai0310さんの感想を踏まえてもう一度わからないところを学習していきます。 ありがとうございました!
guest

0

ベストアンサー

一覧画面と詳細画面でURL階層が変わっていることが原因です。
相対パスで書かれているため、
詳細画面では/show/storage/upload/・・・を参照しに行っています。
一覧もですが、public_path()など利用してWebルートからの絶対パスを指定するように調整してください。

投稿2021/03/01 10:11

m.ts10806

総合スコア80850

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

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

hase07_prog

2021/03/01 11:17

m.ts 10806さん 回答、ご指摘頂きありがとうございます。 お恥ずかしい事なのですが、public_path()はどのように使用したらいいのでしょうか? コントローラのshowアクションで記述して、調整するのか ルーティングファイルで、使用するのかわからない状態で パスの指定方法がうまくいかなくてつまずいています。 申し訳ありませんが、返信お待ちしております
m.ts10806

2021/03/01 11:41

ご自身でもasset()とか使われてますよね。
hase07_prog

2021/03/07 05:53

m.ts10806さん、返信が遅くなり申し訳ありません。 ご指摘して頂きありがとうございます。 無事画像を表示することができました。 show.blade.phpの、imgタグのsrc属性で{{ '/' . $menu->cooking_image }}という風に '/'を連結させたら、画像が表示されました。 アドバイス頂いたpublic_path関数を使用するのではない方法で解決したのですが なぜ、'/'を連結させることで画像が表示できたのでしょうか?
m.ts10806

2021/03/07 07:34

Webルートからの絶対パスになるから。
hase07_prog

2021/03/07 13:55

ありがとうございます。 色々質問に答えて頂きありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問