TKngDisuke
@TKngDisuke (大輔 徳永)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

MYSQLのPRIMARYKEYを作成した時の値を取り出したい(AUTO_INCREMENTタイプ)

解決したいこと

MYSQLのPRIMARYKEYを作成した時の値を取り出したいと思っています。
例)
Laravelで画像を投稿するサイトを作っています。
そこで画像を新規登録する際に必要なデータベースをmigrationで作りました。

    public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
            $table->string('name');
            $table->integer('price');
            $table->string('image');
            $table->integer('type');
        });
    }

聞きたい内容は
画像を保存する際に個別で識別できるidを使って保存するようにしたい。そのためにはidを作成時に取り出す必要はありますが、そのPRIMARYKEYのidはデータベースを作成した際に自動的にAUTO_INCREMENTタイプにしているようなのでControllerで取り出す際には特別な操作が必要となり、Postメソッドなどを使ってidを取り出すこともできません。ちなみに今はidを取り出すことを諦めて
$request->nameを利用して画像を保存しようとしましたが、unexpected '$request' (T_VARIABLE)とエラーが出てしまい、画像保存ができないです。
またnameを利用して画像を保存してしまうと後々、商品の名前を変更した際に画像がうまく読み込まれないなどのバグが絶対に起きるはずなのでやはりPRIMARYKEYのidがいいかと思っています。
詳細は下に長く書いてあります。
また参考にしたサイトはこちらです。。
https://nebikatsu.com/8001.html/

Controllerはこちら

ProductControler.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Product;
use Validator;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
class ProductController extends Controller
{
    public function index()
    {
     $products = Product::all();//レコード取得
     return view('product.index',['images'=>$images]); //一覧ページ表示
     }
    public function form()
    {    
        return view('product.form'); //一覧ページ表示
    }
//保存処理がちょい複雑かもぉ(o_o)「
    public function store(Request $request)
    {
        $product = new Product;
        $product->name =$request->name;
        $h=$request->name;
        $product->price =$request->price;
        $product->type =$request->type;
if($request->image){
    if($request->image->extension() == 'gif' || $request->image->extension() == 'jpeg' || $request->image->extension() == 'jpg' || $request->image->extension() == 'png'){
    $request->file('image')->storeAs('public/post_img', $_POST['name'].'.'.$request->image->extension());
    }
}
$product->image='/storage/post_img/'$request->name'.'$request->image->extension();
$product->save();
        return redirect ('/image/form');
    }
}

そしてModel、Controllerを作り、Viewも作りました。ルーティングもこちらです。

Product.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
    protected $guarded = array('id');
    public $timestamps = false;
    protected $fillable = [
        'image',
        ];
    public static $rules = array(
       'name' => 'required',
       'price' => 'integer|min:0|max:10000',
       'type' => 'integer|min:0|max:200',
    );
    public function getData()
    {
       return $this->id . ': ' . $this->name . ' (' 
          . $this->price . '円'.$this->type . $this->image . 'タイプ )';
    }//あとで画像も表示したい
    public function board()
 {
    return $this->hasOne('App\Models\Product');
 }
 public function boards()
 {   return $this->hasMany('App\Models\Product');
 }
    use HasFactory;
}
form.blade.php
@if (count($errors) > 0)
   <div>
       <ul>
           @foreach ($errors->all() as $error)
               <li>{{ $error }}</li>
           @endforeach
       </ul>
   </div>
   @endif
   <table>
        <form method="post" action="/image/form" enctype="multipart/form-data"> 
        @csrf
        <tr><th>name:
            </th><td><input type="text" name="name"></td></tr>
        <tr><th>price:
            </th><td><input type="text" name="price"></td></tr>
        <tr><th>type:
            </th><td><input type="number" name="type"></td></tr>
            <p>&nbsp;</p>
    <p>画像をアップロード</p>
    <input type="file" name="image">
    <p>&nbsp;</p>
            <input type="submit" class="submitbtn">
   </form>
   </table>
index.blade.php
@extends('layouts.helloapp')
@section('title', 'Product.index')
@section('menubar')
   @parent
   インデックスページ
@endsection
@section('content')
   <table>
   <tr><th>Production</th><th>Board</th></tr>
   @foreach($products as $product)
   <td>{{$product->getData()}}</td>
@endforeach
@if(file_exists(public_path().'/storage/post_img/'. $datas->id .'.jpg'))
    <img src="/storage/post_img/{{ $datas->id }}.jpg">
@elseif(file_exists(public_path().'/storage/post_img/'. $datas->id .'.jpeg'))
    <img src="/storage/post_img/{{ $datas->id }}.jpeg">
@elseif(file_exists(public_path().'/storage/post_img/'. $datas->id .'.png'))
    <img src="/storage/post_img/{{ $datas->id }}.png">
@elseif(file_exists(public_path().'/storage/post_img/'. $datas->id .'.gif'))
    <img src="/storage/post_img/{{ $datas->id }}.gif">
@endif

   </table>
   <div style="margin:10px;"></div>
   <table>
   <tr><th>Product</th></tr>
   </table>
@endsection
@section('footer')
copyright 2017 tuyano.
@endsection
<a href="http://127.0.0.1:8000/image/form">商品を編集する</a>

更新

web.php
Route::get('image', [ProductController::class,'index']);
Route::get('image/form', [ProductController::class,'form']);
Route::post('image/form', [ProductController::class,'store'])->name('image.store');
0

1Answer

エラーが出ているのは

$product->image='/storage/post_img/'$request->name'.'$request->image->extension();

ここで文字列結合演算子の . がいくつか抜けているからです。


AUTO_INCREMENT の次の値は取ろうと思えば取れますが、それよりは画像のファイル名をランダムにしたほうが楽です。 use Illuminate\Support\Str; して Str::uuid() するとランダムな UUID が取得できます。

0Like

Comments

  1. @TKngDisuke

    Questioner

    無事、保存することができました!ありがとうございます。
    <img src="/storage/post_img/21bee79b-7d92-4ced-a70c-f13a7448e32c.png">
    をindexに置くと画像が表示されました!
    そして
    viewのindexページに
    @foreach($products as $product)
    <td>{{$product->getData()}}</td>
    @if(file_exists(public_path().$product->image))
    <img src="{{$product->image}}">
    @endif
    @endforeach
    を書くと画像が表示されました。Modelにこういうのは書くべきだと思うのでModelを変更しようと思います。
    Modelに
    public function imageData()
    {if(file_exists(public_path().$this->image))
    {return <img src="{{$this->image}}">}
    }と書いたのですが、うまくいきませんでした。。

Your answer might help someone💌