こんばんは。
Laravelを扱う勉強を兼ねて、画像投稿掲示板を作成しているのですが、投稿した画像のファイルパスをDBに格納させる方法が調べてみても上手く実装できず詰まってしまいました。
storage:link ArtisanコマンドでStorageフォルダを作成、その中に画像を保存するところまでは上手くできました。
具体的に行いたいことは下記の通りです。
1.投稿した画像ファイルをstorage/app/imagesフォルダに保存(現状出来上がったのはここまでです。)
2.保存した画像ファイルのファイルパスをDBに格納
3.ファイルパスを参照し、詳細ぺージで画像を表示
環境は以下の通りです。
FW:Laravel6.0
OS:Windows10 Home
DB:MySQL(phpmyadmin)
以下、Pictureクラスのコントローラ、詳細ページのビュー、新規投稿ページのビュー、ルーティング、picturesテーブル定義のソースコードです。
PictureController.php
1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6use App\Picture; 7 8class PictureController extends Controller 9{ 10 /** 11 * Display a listing of the resource. 12 * 13 * @return \Illuminate\Http\Response 14 */ 15 public function index(Request $request) 16 { 17 if($request->filled('keyword')){ 18 $keyword=$request->input('keyword'); 19 $message='「'.$keyword.'」で検索'; 20 $pictures = Picture::where('content','like','%'.$keyword.'%')->get(); 21 //データベースに格納されてあるデータの中で、入力されたキーワードが含まれているものを呼び出す。 22 }else{ 23 $message='This is my picture memo.'; 24 $pictures = Picture::all(); 25 //データベースに格納されてあるデータを全て呼び出す。 26 } 27 return view('index',['message'=>$message,'pictures'=>$pictures]); 28 //html上にここで格納した変数の中身を表示させる為に渡す。 29 } 30 31 /** 32 * Show the form for creating a new resource. 33 * 34 * @return \Illuminate\Http\Response 35 */ 36 public function create(Request $request) 37 { 38 $message='New picture'; 39 return view('new',['message'=>$message]); 40 } 41 42 /** 43 * Store a newly created resource in storage. 44 * 45 * @param \Illuminate\Http\Request $request 46 * @return \Illuminate\Http\Response 47 */ 48 public function store(Request $request) 49 { 50 $picture=new picture(); 51 //投稿した画像とコメントをDBに格納させる 52 $picture->user_name=$request->user_name; 53 $picture->content=$request->content; 54 $picture->image=$request->file('thefile')->storeAs('images', 'image'.$picture->id); //storageフォルダに投稿した画像を保存する 55 $picture->save(); 56 //tinkerコマンドと同じ 57 return redirect()->route('picture.show',['id'=>$picture->id]); 58 } 59 60 /** 61 * Display the specified resource. 62 * 63 * @param \App\picture $picture 64 * @return \Illuminate\Http\Response 65 */ 66 public function show(Request $request,$id,Picture $picture) 67 { 68 $message='This is your picture.'.$id; 69 $picture=Picture::find($id); 70 //$idに格納された番号と一致したデータを引っ張り出す。 71 return view('show',['message'=>$message,'picture'=>$picture]); 72 } 73 74 /** 75 * Show the form for editing the specified resource. 76 * 77 * @param \App\picture $picture 78 * @return \Illuminate\Http\Response 79 */ 80 public function edit(Request $request,$id,picture $picture) 81 { 82 $message='Edit your picture.'.$id; 83 $picture=Picture::find($id); 84 //$idに格納された番号と一致したデータを引っ張り出す。 85 return view('edit',['message'=>$message,'picture'=>$picture]); 86 } 87 88 /** 89 * Update the specified resource in storage. 90 * 91 * @param \Illuminate\Http\Request $request 92 * @param \App\picture $picture 93 * @return \Illuminate\Http\Response 94 */ 95 public function update(Request $request,$id, picture $picture) 96 { 97 $picture=Picture::find($id); 98 //登録したブックマークをDBに格納させる 99 $picture->content=$request->content; 100 $picture->user_name=$request->user_name; 101 $picture->save(); 102 //tinkerコマンドと同じ 103 return redirect()->route('picture.show',['id'=>$picture->id]); 104 } 105 106 /** 107 * Remove the specified resource from storage. 108 * 109 * @param \App\picture $picture 110 * @return \Illuminate\Http\Response 111 */ 112 public function destroy(Request $request,$id,picture $picture) 113 { 114 $picture=Picture::find($id); 115 $picture->delete(); 116 return redirect('/pictures'); 117 } 118}
new.blade.php
1@extends('layout') 2 3@section('content') 4<h1>MYPICTURE</h1> 5<p>{{$message}}</p> 6{{Form::open(['route'=>'picture.store','files'=>true])}} 7<div class="form-group"> 8 <!--投稿した画像のユーザーネームをDBに格納させる--> 9 {{Form::label('user_name','Name:')}} 10 {{Form::text('user_name',null)}} 11</div> 12<div class='form-group'> 13 <!--投稿したコメントをDBに格納するビュー--> 14 {{Form::label('content','Content:')}} 15 {{Form::text('content',null)}} 16</div> 17<div class='form-group'> 18 <!--ファイルを読み込む--> 19 {{Form::file('thefile')}} 20</div> 21<div class="form-group"> 22 {{Form::submit('作成する',['class'=>'btn btn-primary'])}} 23 <a href='{{ route("picture.list")}}'>一覧に戻る</a> 24</div> 25{{Form::close()}} 26@endsection
Web.php
1<?php 2 3/* 4|-------------------------------------------------------------------------- 5| Web Routes 6|-------------------------------------------------------------------------- 7| 8| Here is where you can register web routes for your application. These 9| routes are loaded by the RouteServiceProvider within a group which 10| contains the "web" middleware group. Now create something great! 11| 12*/ 13 14Route::get('/', function () { 15 return redirect('/picture'); 16}); 17Route::get('/pictures','PictureController@index')->name('picture.list'); 18Route::get('/picture/new','PictureController@create')->name('picture.new'); 19Route::post('/picture','PictureController@store')->name('picture.store'); 20Route::get('/picture/edit/{id}','PictureController@edit')->name('picture.edit'); 21Route::post('/picture/update/{id}','PictureController@update')->name('picture.update'); 22Route::get('/picture/{id}', 'PictureController@show')->name('picture.show'); 23Route::delete('/picture/{id}','PictureController@destroy')->name('picture.delete'); 24?>
show.blade.php
1 @extends('layout') 2<!--各ページのビューを司る--> 3@section('content') 4<h1>MYPICTURE</h1> 5<div> 6 <p>{{$message}}</p> 7 <p>{{$picture -> content}}</p> 8 <p>{{$picture -> user_name}}</p> 9 <p> 10 <a href='{{route ("picture.list")}}' class='btn btn-outline-primary'>一覧に戻る</a> 11 <a href='{{route ("picture.edit",["id"=>$picture->id])}}' class='btn btn-outline-primary'>編集</a> 12 13 </p> 14</div> 15<div> 16 {{Form::open(['method' => 'delete','route'=> ['picture.delete',$picture->id]])}} 17 {{Form::submit('削除')}} 18 {{Form::close()}} 19</div> 20@endsection
2020_01_05_062834_create_pictures_table.php
1<?php 2 3use Illuminate\Database\Migrations\Migration; 4use Illuminate\Database\Schema\Blueprint; 5use Illuminate\Support\Facades\Schema; 6 7class CreatepicturesTable extends Migration 8{ 9 /** 10 * Run the migrations. 11 * 12 * @return void 13 */ 14 public function up() 15 { 16 Schema::create('pictures', function (Blueprint $table) { 17 $table->bigIncrements('id'); 18 $table->string('content'); 19 $table->timestamps(); 20 }); 21 } 22 23 /** 24 * Reverse the migrations. 25 * 26 * @return void 27 */ 28 public function down() 29 { 30 Schema::dropIfExists('pictures'); 31 } 32} 33
2020_01_12_155013_add_column_username.php
1<?php 2 3use Illuminate\Database\Migrations\Migration; 4use Illuminate\Database\Schema\Blueprint; 5use Illuminate\Support\Facades\Schema; 6 7class AddColumnUsername extends Migration 8{ 9 /** 10 * Run the migrations. 11 * 12 * @return void 13 */ 14 public function up() 15 { 16 Schema::table('pictures', function (Blueprint $table) { 17 $table->string('user_name'); 18 }); 19 } 20 21 /** 22 * Reverse the migrations. 23 * 24 * @return void 25 */ 26 public function down() 27 { 28 Schema::table('picture', function (Blueprint $table) { 29 // 30 }); 31 } 32} 33
2020_05_27_145554_add_column_image.php
1<?php 2 3use Illuminate\Database\Migrations\Migration; 4use Illuminate\Database\Schema\Blueprint; 5use Illuminate\Support\Facades\Schema; 6 7class AddColumnImage extends Migration 8{ 9 /** 10 * Run the migrations. 11 * 12 * @return void 13 */ 14 public function up() 15 { 16 Schema::table('pictures', function (Blueprint $table) { 17 //投稿した画像のファイルパスを格納 18 $table->string('image'); 19 }); 20 } 21 22 /** 23 * Reverse the migrations. 24 * 25 * @return void 26 */ 27 public function down() 28 { 29 Schema::table('pictures', function (Blueprint $table) { 30 // 31 }); 32 } 33} 34
以下、作成したDBのキャプチャです。
「image」カラム(String型)にファイルパスを格納するつもりです。(スクショ撮影時はnullになっています。)
20200530追記
Pictureのモデルクラスですが、artisanでファイルを作成したのみで、中身は未設定です。
picture.php
1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6 7class picture extends Model 8{ 9 // 10} 11
以上、不勉強で至らぬ所ではございますが、ご教授・ご助言をお願い致します。m(_ _)m
回答3件
あなたの回答
tips
プレビュー