Laravelでのデータベースによる管理でのphpmyadminに関するエラーについて
解決したいこと
エラーが起きた内容が複雑なので分かりづらかったらご指摘頂けると助かります。
Laravelにてフリーマーケットサイトを作成していて自身が新しく商品を出品する際のエラーなのですが、商品関連でitemsテーブルを用意していて ユーザー側がname,description,category_id,price,imageカラムを書き換えられるようにしたいです。
ただ、そこで出品ボタンを押して更新しようとした際に画像のようなエラーが出てしまいデータベース側のエラーと思いorderテーブルに外部キー制約を設定し出品商品関連のテーブルであるitemsテーブルのidと繋げようとしたのですがエラーが発生しました。
質問なのですが、Laravel側のエラーは何が原因なのか、データベース側のphpmyadminでの外部キーが作成出来ないエラーの原因とやり方を教えて欲しいです。
発生している問題・エラー
SQLSTATE[HY000]: General error: 1364 Field 'user_id' doesn't have a default value (SQL: insert into `items` (`description`, `updated_at`, `created_at`) values (美味しいみかん, 2022-12-15 17:14:03, 2022-12-15 17:14:03))
または、問題・エラーが起きている画像をここにドラッグアンドドロップ
![無題1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2535445/fbf92d97-d80a-23a2-d0f2-42b2109d8469.png)
![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2535445/2fe144e8-8c81-6bc4-337a-e109846e4394.png)
該当するソースコード
ソースコードを入力
web.php(ルーティング)
<?php
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Auth::routes();
// トップページをログイン画面後に表示させたい場合はmiddlewareを書かないとエラーが出る
Route::get('/', function () {
return view('layouts.top');
})->middleware('auth');
// お気に入り一覧
Route::resource('likes', 'LikesController')->only([
'index', 'store', 'destroy'
]);
Route::resource('items', 'ItemsController');
Route::resource('profile', 'ProfileController')->only([
'store', 'destroy'
]);
Route::get('users/{id}/index', 'ItemsController@index')->name('users.index');
Route::get('/items/{id}/edit_image', 'ItemsController@editImage')->name('items.edit_image');
Route::patch('/items/{id}/edit_image', 'ItemsController@editImage')->name('items.update_image');
Route::get('/profile/{id}/edit', 'ProfileController@edit')->name('profile.edit');
Route::patch('/profile/{id}', 'ProfileController@update')->name('profile.update');
Route::get('/profile/{id}/edit_image', 'ProfileController@editImage')->name('profile.edit_image');
Route::patch('/profile/{id}/edit_image', 'ProfileController@updateImage')->name('profile.update_image');
Route::resource('profile', 'ProfileController')->only([
'show',
]);
ItemsController.php(コントローラー)
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Items;
use App\User;
use App\Http\Requests\ItemsRequest;
use App\Http\Requests\ItemsImageRequest;
//use App\Http\Requests\ProfileImageRequest;
use App\Services\FileUploadService;
class ItemsController extends Controller
{
public function __construct()
{
$this->middleware('auth');
}
public function index()
{
$items = Items::where('user_id', \Auth::user()->id)->get();
return view('users.index',[
'title' => '出品商品一覧',
'items' => $items,
]);
}
//新規出品
public function create()
{
return view('items.create',[
'title' => '商品を出品'
]);
}
public function store(ItemsRequest $request, FileUploadService $service)
{
// 画像投稿処理
$path = $this->saveImage($request->file('image'));
$path= '';
$image = $request->file('image');
if(isset($image) === true ){
// publicディスク(storage/app/public/)のphotosディレクトリに保存
$path = $image->store('photos', 'public');
}
Items::create([
'user' => \Auth::user(),
//'categories' => Categories::all(),
'description' => $request->description,
'image' => $path, //ファイルパスを保存
]);
session()->flash('success', '商品を出品しました');
return redirect()->route('users.exhibitions');
}
// 購入詳細
public function show($id)
{
//
}
// 商品情報の編集
public function edit(Items $items)
{
return view('items.edit',[
'title' => '出品編集',
'items' => $items,
]);
}
public function update(Request $request, $id)
{
$items = Items::find($id);
$items->update($request->only(['description']));
session()->flash('success', '出品しました');
return redirect()->route('items.index');
}
public function destroy($id)
{
$items = Items::find($id);
$items ->delete();
\Session::flash('success', '商品を削除しました');
return redirect()->route('items.index');
}
public function editImage($id)
{
$items = Items::find($id);
return view('items.edit_image',[
'title' => '画像変更処理',
'items' => $items,
]);
}
public function updateImage($id, ItemsImageRequest $request, FileUploadService $service)
{
//画像投稿処理
$path = '';
$image = $request->file('image');
if(isset($image) === true){
// publicディスク(storage/app/)のphotosディレクトリに保存
$path = $image->store('photos', 'public');
}
$items = Items::find($id);
// 変更前の画像の削除
if($items->image !== ''){
// publicディスクから、該当の投稿画像($user->image)を削除
\Storage::disk('public')->delete(\Storage::url($items->image));
}
$items->update([
'image' => $path, //ファイル名を保存
]);
session()->flash('success', '画像を変更しました!');
return redirect()->route('users.index', $id);
}
private function saveImage($image){
// 画像投稿処理
$path = '';
if(isset($image) === true){
// publicディスク(storage/app/)のphotosディレクトリに保存
$path = $image->store('photos', 'public');
}
return $path;; // 画像が存在しない場合は空文字
}
}
index.blade.php(商品一覧のビュー)
@extends('layouts.top')
@section('title', $title)
@section('content')
<h1>{{ $title }}</h1>
<a href="{{route('items.create')}}">新規出品</a>
<ul>
@forelse($items as $item)
<li class="items">
<div class="items_content">
<div class="items_body_heading">
<div class="items_body_main_img">
@if($items->image !== '')
<img src="{{ asset('storage/' . $items->image) }}">
@else
<img src="{{ asset('images/no_image.png') }}">
@endif
</div>
<div class="items_body_main_comment">
{{ $items->description }}
</div>
</div>
<div class="items_body_main">
商品名:{{ $items->name }}
{{ $items->price }}
</div>
<div class="items_category">
カテゴリ:{{ $items->category_id }}
({{ $items->created_at }})
</div>
<div class="items_body_footer">
[<a href="{{ route('items.edit', $items) }}">編集</a>]
<form class="delete" method="post" action="{{ route('items.destroy', $items) }}">
@csrf
@method('DELETE')
<input type="submit" value="削除">
</div>
</div>
</li>
@empty
<li>出品している商品はありません。</li>
@endforelse
</ul>
@endsection
create.blade.php(新規出品用のビュー)
@extends('layouts.top')
@section('title', $title)
@section('content')
<h1>{{ $title }}</h1>
<form method="POST"
action="{{ action('ItemsController@store') }}"
enctype="multipart/form-data">
@csrf
<div>
<label>
商品名:
<input type="text" name="name">
</label>
</div>
<div>
<label>
商品説明:
<input type="text" name="description">
</label>
</div>
<div>
<label>
価格:
<input type="text" name="price">
</label>
</div>
<div>
<label>
カテゴリー:
<input type="text" name="categories">
</label>
</div>
<div>
<label>
画像を選択:
<input type="file" name="image">
</label>
</div>
<input type="submit" value="出品">
</form>
@endsection
items.php(商品用のitemクラス)
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Items extends Model
{
protected $fillable = [
'name', 'description', 'category_id', 'price'
];
}
10_27_174652_create_items_table.php(マイグレーションファイル)
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateItemsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('items', function (Blueprint $table) {
$table->bigIncrements('id');
// usersのidと同じデータ型に設定する
// bigIncrementsで設定されるデータ型はunsignedBigInteger
$table->unsignedBigInteger('user_id');
$table->string('name', 255);
$table->string('description', 1000);
$table->string('image', 100);
$table->timestamps();
$table->integer('price')->unsigned();
// user_id は users の id に対して外部キー制約を設定
$table->foreign('user_id')->references('id')->on('users')->onDelte('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('items');
}
}
自分で試したこと
外部キー制約の方法の確認、エラー内容の見直し
0