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はこちら
<?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も作りました。ルーティングもこちらです。
<?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;
}
@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> </p>
<p>画像をアップロード</p>
<input type="file" name="image">
<p> </p>
<input type="submit" class="submitbtn">
</form>
</table>
@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>
更新
Route::get('image', [ProductController::class,'index']);
Route::get('image/form', [ProductController::class,'form']);
Route::post('image/form', [ProductController::class,'store'])->name('image.store');